init
21
.check.exs
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
[
|
||||||
|
## all available options with default values (see `mix check` docs for description)
|
||||||
|
# parallel: true,
|
||||||
|
# skipped: true,
|
||||||
|
|
||||||
|
## list of tools (see `mix check` docs for defaults)
|
||||||
|
tools: [
|
||||||
|
## curated tools may be disabled (e.g. the check for compilation warnings)
|
||||||
|
# {:compiler, false},
|
||||||
|
|
||||||
|
## ...or adjusted (e.g. use one-line formatter for more compact credo output)
|
||||||
|
# {:credo, "mix credo --format oneline"},
|
||||||
|
|
||||||
|
{:doctor, false}
|
||||||
|
|
||||||
|
## custom new tools may be added (mix tasks or arbitrary commands)
|
||||||
|
# {:my_mix_task, command: "mix release", env: %{"MIX_ENV" => "prod"}},
|
||||||
|
# {:my_arbitrary_tool, command: "npm test", cd: "assets"},
|
||||||
|
# {:my_arbitrary_script, command: ["my_script", "argument with spaces"], cd: "scripts"}
|
||||||
|
]
|
||||||
|
]
|
184
.credo.exs
Normal file
|
@ -0,0 +1,184 @@
|
||||||
|
# This file contains the configuration for Credo and you are probably reading
|
||||||
|
# this after creating it with `mix credo.gen.config`.
|
||||||
|
#
|
||||||
|
# If you find anything wrong or unclear in this file, please report an
|
||||||
|
# issue on GitHub: https://github.com/rrrene/credo/issues
|
||||||
|
#
|
||||||
|
%{
|
||||||
|
#
|
||||||
|
# You can have as many configs as you like in the `configs:` field.
|
||||||
|
configs: [
|
||||||
|
%{
|
||||||
|
#
|
||||||
|
# Run any config using `mix credo -C <name>`. If no config name is given
|
||||||
|
# "default" is used.
|
||||||
|
#
|
||||||
|
name: "default",
|
||||||
|
#
|
||||||
|
# These are the files included in the analysis:
|
||||||
|
files: %{
|
||||||
|
#
|
||||||
|
# You can give explicit globs or simply directories.
|
||||||
|
# In the latter case `**/*.{ex,exs}` will be used.
|
||||||
|
#
|
||||||
|
included: [
|
||||||
|
"lib/",
|
||||||
|
"src/",
|
||||||
|
"test/",
|
||||||
|
"web/",
|
||||||
|
"apps/*/lib/",
|
||||||
|
"apps/*/src/",
|
||||||
|
"apps/*/test/",
|
||||||
|
"apps/*/web/"
|
||||||
|
],
|
||||||
|
excluded: [~r"/_build/", ~r"/deps/", ~r"/node_modules/"]
|
||||||
|
},
|
||||||
|
#
|
||||||
|
# Load and configure plugins here:
|
||||||
|
#
|
||||||
|
plugins: [],
|
||||||
|
#
|
||||||
|
# If you create your own checks, you must specify the source files for
|
||||||
|
# them here, so they can be loaded by Credo before running the analysis.
|
||||||
|
#
|
||||||
|
requires: [],
|
||||||
|
#
|
||||||
|
# If you want to enforce a style guide and need a more traditional linting
|
||||||
|
# experience, you can change `strict` to `true` below:
|
||||||
|
#
|
||||||
|
strict: false,
|
||||||
|
#
|
||||||
|
# To modify the timeout for parsing files, change this value:
|
||||||
|
#
|
||||||
|
parse_timeout: 5000,
|
||||||
|
#
|
||||||
|
# If you want to use uncolored output by default, you can change `color`
|
||||||
|
# to `false` below:
|
||||||
|
#
|
||||||
|
color: true,
|
||||||
|
#
|
||||||
|
# You can customize the parameters of any check by adding a second element
|
||||||
|
# to the tuple.
|
||||||
|
#
|
||||||
|
# To disable a check put `false` as second element:
|
||||||
|
#
|
||||||
|
# {Credo.Check.Design.DuplicatedCode, false}
|
||||||
|
#
|
||||||
|
checks: [
|
||||||
|
#
|
||||||
|
## Consistency Checks
|
||||||
|
#
|
||||||
|
{Credo.Check.Consistency.ExceptionNames, []},
|
||||||
|
{Credo.Check.Consistency.LineEndings, []},
|
||||||
|
{Credo.Check.Consistency.ParameterPatternMatching, []},
|
||||||
|
{Credo.Check.Consistency.SpaceAroundOperators, []},
|
||||||
|
{Credo.Check.Consistency.SpaceInParentheses, []},
|
||||||
|
{Credo.Check.Consistency.TabsOrSpaces, []},
|
||||||
|
|
||||||
|
#
|
||||||
|
## Design Checks
|
||||||
|
#
|
||||||
|
# You can customize the priority of any check
|
||||||
|
# Priority values are: `low, normal, high, higher`
|
||||||
|
#
|
||||||
|
{Credo.Check.Design.AliasUsage, false},
|
||||||
|
# You can also customize the exit_status of each check.
|
||||||
|
# If you don't want TODO comments to cause `mix credo` to fail, just
|
||||||
|
# set this value to 0 (zero).
|
||||||
|
#
|
||||||
|
{Credo.Check.Design.TagTODO, [exit_status: 2]},
|
||||||
|
{Credo.Check.Design.TagFIXME, []},
|
||||||
|
|
||||||
|
#
|
||||||
|
## Readability Checks
|
||||||
|
#
|
||||||
|
{Credo.Check.Readability.AliasOrder, []},
|
||||||
|
{Credo.Check.Readability.FunctionNames, []},
|
||||||
|
{Credo.Check.Readability.LargeNumbers, []},
|
||||||
|
{Credo.Check.Readability.MaxLineLength, [priority: :low, max_length: 120]},
|
||||||
|
{Credo.Check.Readability.ModuleAttributeNames, []},
|
||||||
|
{Credo.Check.Readability.ModuleDoc, []},
|
||||||
|
{Credo.Check.Readability.ModuleNames, []},
|
||||||
|
{Credo.Check.Readability.ParenthesesInCondition, []},
|
||||||
|
{Credo.Check.Readability.ParenthesesOnZeroArityDefs, []},
|
||||||
|
{Credo.Check.Readability.PredicateFunctionNames, []},
|
||||||
|
{Credo.Check.Readability.PreferImplicitTry, []},
|
||||||
|
{Credo.Check.Readability.RedundantBlankLines, []},
|
||||||
|
{Credo.Check.Readability.Semicolons, []},
|
||||||
|
{Credo.Check.Readability.SpaceAfterCommas, []},
|
||||||
|
{Credo.Check.Readability.StringSigils, []},
|
||||||
|
{Credo.Check.Readability.TrailingBlankLine, []},
|
||||||
|
{Credo.Check.Readability.TrailingWhiteSpace, []},
|
||||||
|
{Credo.Check.Readability.UnnecessaryAliasExpansion, []},
|
||||||
|
{Credo.Check.Readability.VariableNames, []},
|
||||||
|
|
||||||
|
#
|
||||||
|
## Refactoring Opportunities
|
||||||
|
#
|
||||||
|
{Credo.Check.Refactor.CondStatements, []},
|
||||||
|
{Credo.Check.Refactor.CyclomaticComplexity, false},
|
||||||
|
{Credo.Check.Refactor.FunctionArity, [max_arity: 13]},
|
||||||
|
{Credo.Check.Refactor.LongQuoteBlocks, false},
|
||||||
|
{Credo.Check.Refactor.MapInto, false},
|
||||||
|
{Credo.Check.Refactor.MatchInCondition, []},
|
||||||
|
{Credo.Check.Refactor.NegatedConditionsInUnless, []},
|
||||||
|
{Credo.Check.Refactor.NegatedConditionsWithElse, []},
|
||||||
|
{Credo.Check.Refactor.Nesting, [max_nesting: 6]},
|
||||||
|
{Credo.Check.Refactor.UnlessWithElse, []},
|
||||||
|
{Credo.Check.Refactor.WithClauses, []},
|
||||||
|
|
||||||
|
#
|
||||||
|
## Warnings
|
||||||
|
#
|
||||||
|
{Credo.Check.Warning.BoolOperationOnSameValues, []},
|
||||||
|
{Credo.Check.Warning.ExpensiveEmptyEnumCheck, []},
|
||||||
|
{Credo.Check.Warning.IExPry, []},
|
||||||
|
{Credo.Check.Warning.IoInspect, []},
|
||||||
|
{Credo.Check.Warning.LazyLogging, false},
|
||||||
|
{Credo.Check.Warning.MixEnv, false},
|
||||||
|
{Credo.Check.Warning.OperationOnSameValues, []},
|
||||||
|
{Credo.Check.Warning.OperationWithConstantResult, []},
|
||||||
|
{Credo.Check.Warning.RaiseInsideRescue, []},
|
||||||
|
{Credo.Check.Warning.UnusedEnumOperation, []},
|
||||||
|
{Credo.Check.Warning.UnusedFileOperation, []},
|
||||||
|
{Credo.Check.Warning.UnusedKeywordOperation, []},
|
||||||
|
{Credo.Check.Warning.UnusedListOperation, []},
|
||||||
|
{Credo.Check.Warning.UnusedPathOperation, []},
|
||||||
|
{Credo.Check.Warning.UnusedRegexOperation, []},
|
||||||
|
{Credo.Check.Warning.UnusedStringOperation, []},
|
||||||
|
{Credo.Check.Warning.UnusedTupleOperation, []},
|
||||||
|
{Credo.Check.Warning.UnsafeExec, []},
|
||||||
|
|
||||||
|
#
|
||||||
|
# Checks scheduled for next check update (opt-in for now, just replace `false` with `[]`)
|
||||||
|
|
||||||
|
#
|
||||||
|
# Controversial and experimental checks (opt-in, just replace `false` with `[]`)
|
||||||
|
#
|
||||||
|
{Credo.Check.Readability.StrictModuleLayout, false},
|
||||||
|
{Credo.Check.Consistency.MultiAliasImportRequireUse, false},
|
||||||
|
{Credo.Check.Consistency.UnusedVariableNames, false},
|
||||||
|
{Credo.Check.Design.DuplicatedCode, false},
|
||||||
|
{Credo.Check.Readability.AliasAs, false},
|
||||||
|
{Credo.Check.Readability.MultiAlias, false},
|
||||||
|
{Credo.Check.Readability.Specs, false},
|
||||||
|
{Credo.Check.Readability.SinglePipe, false},
|
||||||
|
{Credo.Check.Readability.WithCustomTaggedTuple, false},
|
||||||
|
{Credo.Check.Refactor.ABCSize, false},
|
||||||
|
{Credo.Check.Refactor.AppendSingleItem, false},
|
||||||
|
{Credo.Check.Refactor.DoubleBooleanNegation, false},
|
||||||
|
{Credo.Check.Refactor.ModuleDependencies, false},
|
||||||
|
{Credo.Check.Refactor.NegatedIsNil, false},
|
||||||
|
{Credo.Check.Refactor.PipeChainStart, false},
|
||||||
|
{Credo.Check.Refactor.VariableRebinding, false},
|
||||||
|
{Credo.Check.Warning.LeakyEnvironment, false},
|
||||||
|
{Credo.Check.Warning.MapGetUnsafePass, false},
|
||||||
|
{Credo.Check.Warning.UnsafeToAtom, false}
|
||||||
|
|
||||||
|
#
|
||||||
|
# Custom checks can be created using `mix credo.gen.check`.
|
||||||
|
#
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
4
.formatter.exs
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
# Used by "mix format"
|
||||||
|
[
|
||||||
|
inputs: ["{mix,.formatter}.exs", "{config,lib,test}/**/*.{ex,exs}"]
|
||||||
|
]
|
76
.github/CODE_OF_CONDUCT.md
vendored
Normal file
|
@ -0,0 +1,76 @@
|
||||||
|
# Contributor Covenant Code of Conduct
|
||||||
|
|
||||||
|
## Our Pledge
|
||||||
|
|
||||||
|
In the interest of fostering an open and welcoming environment, we as
|
||||||
|
contributors and maintainers pledge to making participation in our project and
|
||||||
|
our community a harassment-free experience for everyone, regardless of age, body
|
||||||
|
size, disability, ethnicity, sex characteristics, gender identity and expression,
|
||||||
|
level of experience, education, socio-economic status, nationality, personal
|
||||||
|
appearance, race, religion, or sexual identity and orientation.
|
||||||
|
|
||||||
|
## Our Standards
|
||||||
|
|
||||||
|
Examples of behavior that contributes to creating a positive environment
|
||||||
|
include:
|
||||||
|
|
||||||
|
* Using welcoming and inclusive language
|
||||||
|
* Being respectful of differing viewpoints and experiences
|
||||||
|
* Gracefully accepting constructive criticism
|
||||||
|
* Focusing on what is best for the community
|
||||||
|
* Showing empathy towards other community members
|
||||||
|
|
||||||
|
Examples of unacceptable behavior by participants include:
|
||||||
|
|
||||||
|
* The use of sexualized language or imagery and unwelcome sexual attention or
|
||||||
|
advances
|
||||||
|
* Trolling, insulting/derogatory comments, and personal or political attacks
|
||||||
|
* Public or private harassment
|
||||||
|
* Publishing others' private information, such as a physical or electronic
|
||||||
|
address, without explicit permission
|
||||||
|
* Other conduct which could reasonably be considered inappropriate in a
|
||||||
|
professional setting
|
||||||
|
|
||||||
|
## Our Responsibilities
|
||||||
|
|
||||||
|
Project maintainers are responsible for clarifying the standards of acceptable
|
||||||
|
behavior and are expected to take appropriate and fair corrective action in
|
||||||
|
response to any instances of unacceptable behavior.
|
||||||
|
|
||||||
|
Project maintainers have the right and responsibility to remove, edit, or
|
||||||
|
reject comments, commits, code, wiki edits, issues, and other contributions
|
||||||
|
that are not aligned to this Code of Conduct, or to ban temporarily or
|
||||||
|
permanently any contributor for other behaviors that they deem inappropriate,
|
||||||
|
threatening, offensive, or harmful.
|
||||||
|
|
||||||
|
## Scope
|
||||||
|
|
||||||
|
This Code of Conduct applies both within project spaces and in public spaces
|
||||||
|
when an individual is representing the project or its community. Examples of
|
||||||
|
representing a project or community include using an official project e-mail
|
||||||
|
address, posting via an official social media account, or acting as an appointed
|
||||||
|
representative at an online or offline event. Representation of a project may be
|
||||||
|
further defined and clarified by project maintainers.
|
||||||
|
|
||||||
|
## Enforcement
|
||||||
|
|
||||||
|
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
||||||
|
reported by contacting the project team at zach@zachdaniel.dev. All
|
||||||
|
complaints will be reviewed and investigated and will result in a response that
|
||||||
|
is deemed necessary and appropriate to the circumstances. The project team is
|
||||||
|
obligated to maintain confidentiality with regard to the reporter of an incident.
|
||||||
|
Further details of specific enforcement policies may be posted separately.
|
||||||
|
|
||||||
|
Project maintainers who do not follow or enforce the Code of Conduct in good
|
||||||
|
faith may face temporary or permanent repercussions as determined by other
|
||||||
|
members of the project's leadership.
|
||||||
|
|
||||||
|
## Attribution
|
||||||
|
|
||||||
|
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
|
||||||
|
available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
|
||||||
|
|
||||||
|
[homepage]: https://www.contributor-covenant.org
|
||||||
|
|
||||||
|
For answers to common questions about this code of conduct, see
|
||||||
|
https://www.contributor-covenant.org/faq
|
10
.github/CONTRIBUTING.md
vendored
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
# Contributing to Ash
|
||||||
|
|
||||||
|
* We have a zero tolerance policy for failure to abide by our code of conduct. It is very standard, but please make sure
|
||||||
|
you have read it.
|
||||||
|
* Issues may be opened to propose new ideas, to ask questions, or to file bugs.
|
||||||
|
* Before working on a feature, please talk to the core team/the rest of the community via a proposal. We are
|
||||||
|
building something that needs to be cohesive and well thought out across all use cases. Our top priority is
|
||||||
|
supporting real life use cases like yours, but we have to make sure that we do that in a sustainable way. The
|
||||||
|
best compromise there is to make sure that discussions are centered around the *use case* for a feature, rather
|
||||||
|
than the propsed feature itself.
|
27
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
---
|
||||||
|
name: Bug report
|
||||||
|
about: Create a report to help us improve
|
||||||
|
title: ''
|
||||||
|
labels: bug, needs review
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
-https://hexdocs.pm/ash_graphql--
|
||||||
|
|
||||||
|
**Describe the bug**
|
||||||
|
A clear and concise description of what the bug is.
|
||||||
|
|
||||||
|
**To Reproduce**
|
||||||
|
A minimal set of resource definitions and calls that can reproduce the bug.
|
||||||
|
|
||||||
|
**Expected behavior**
|
||||||
|
A clear and concise description of what you expected to happen.
|
||||||
|
|
||||||
|
** Runtime
|
||||||
|
- Elixir version
|
||||||
|
- Erlang version
|
||||||
|
- OS
|
||||||
|
- Ash version
|
||||||
|
- any related extension versions
|
||||||
|
|
||||||
|
**Additional context**
|
||||||
|
Add any other context about the problem here.
|
36
.github/ISSUE_TEMPLATE/proposal.md
vendored
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
---
|
||||||
|
name: Proposal
|
||||||
|
about: Suggest an idea for this project
|
||||||
|
title: ''
|
||||||
|
labels: enhancement, needs review
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Is your feature request related to a problem? Please describe.**
|
||||||
|
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
|
||||||
|
|
||||||
|
**Describe the solution you'd like**
|
||||||
|
A clear and concise description of what you want to happen.
|
||||||
|
|
||||||
|
**Describe alternatives you've considered**
|
||||||
|
A clear and concise description of any alternative solutions or features you've considered.
|
||||||
|
|
||||||
|
**Express the feature either with a change to resource syntax, or with a change to the resource interface**
|
||||||
|
|
||||||
|
For example
|
||||||
|
|
||||||
|
```elixir
|
||||||
|
attributes do
|
||||||
|
attribute :foo, :integer, bar: 10 # <- Adding `bar` here would cause <x>
|
||||||
|
end
|
||||||
|
```
|
||||||
|
|
||||||
|
Or
|
||||||
|
|
||||||
|
```elixir
|
||||||
|
Api.read(:resource, bar: 10) # <- Adding `bar` here would cause <x>
|
||||||
|
```
|
||||||
|
|
||||||
|
**Additional context**
|
||||||
|
Add any other context or screenshots about the feature request here.
|
4
.github/PULL_REQUEST_TEMPLATE.md
vendored
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
### Contributor checklist
|
||||||
|
|
||||||
|
- [ ] Bug fixes include regression tests
|
||||||
|
- [ ] Features include unit/acceptance tests
|
14
.github/workflows/elixir.yml
vendored
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
name: CI
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
tags:
|
||||||
|
- "v*"
|
||||||
|
branches: [main]
|
||||||
|
pull_request:
|
||||||
|
branches: [main]
|
||||||
|
workflow_call:
|
||||||
|
jobs:
|
||||||
|
ash-ci:
|
||||||
|
uses: ash-project/ash/.github/workflows/ash-ci.yml@main
|
||||||
|
secrets:
|
||||||
|
HEX_API_KEY: ${{ secrets.HEX_API_KEY }}
|
26
.gitignore
vendored
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
# The directory Mix will write compiled artifacts to.
|
||||||
|
/_build/
|
||||||
|
|
||||||
|
# If you run "mix test --cover", coverage assets end up here.
|
||||||
|
/cover/
|
||||||
|
|
||||||
|
# The directory Mix downloads your dependencies sources to.
|
||||||
|
/deps/
|
||||||
|
|
||||||
|
# Where third-party dependencies like ExDoc output generated docs.
|
||||||
|
/doc/
|
||||||
|
|
||||||
|
# Ignore .fetch files in case you like to edit your project deps locally.
|
||||||
|
/.fetch
|
||||||
|
|
||||||
|
# If the VM crashes, it generates a dump, let's ignore it too.
|
||||||
|
erl_crash.dump
|
||||||
|
|
||||||
|
# Also ignore archive artifacts (built via "mix archive.build").
|
||||||
|
*.ez
|
||||||
|
|
||||||
|
# Ignore package tarball (built via "mix hex.build").
|
||||||
|
ash_money-*.tar
|
||||||
|
|
||||||
|
# Temporary files, for example, from tests.
|
||||||
|
/tmp/
|
2
.tool-versions
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
erlang 26.0.2
|
||||||
|
elixir 1.15.4
|
1
FUNDING.yml
Normal file
|
@ -0,0 +1 @@
|
||||||
|
github: zachdaniel
|
21
LICENSE
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2020 Zachary Scott Daniel
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
3
README.md
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
# AshMoney
|
||||||
|
|
||||||
|
A money extension for Ash.
|
50
documentation/tutorials/get-started-with-ash-money.md
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
# Getting Started With AshMoney
|
||||||
|
|
||||||
|
The primary thing that AshMoney provides is `AshMoney.Types.Money`. This is backed by `ex_money`. You can use it out of the box like so:
|
||||||
|
|
||||||
|
```elixir
|
||||||
|
attribute :balance, AshMoney.Types.Money
|
||||||
|
```
|
||||||
|
|
||||||
|
Or you can add it to your compile time list of types for easier reference:
|
||||||
|
|
||||||
|
```elixir
|
||||||
|
config :ash, :custom_types, money: AshMoney.Types.Money
|
||||||
|
```
|
||||||
|
|
||||||
|
Then compile ash again, `mix deps.compile ash --force`, and refer to it like so:
|
||||||
|
|
||||||
|
```elixir
|
||||||
|
attribute :balance, :money
|
||||||
|
```
|
||||||
|
|
||||||
|
## AshPostgres Support
|
||||||
|
|
||||||
|
Thanks to `ex_money_sql`, there are excellent tools for lowering support for money into your postgres database. This allows for things like aggregates that sum amounts, and referencing money in expressions:
|
||||||
|
|
||||||
|
```elixir
|
||||||
|
sum :sum_of_usd_balances, :accounts, :balance do
|
||||||
|
filter expr(fragment("(?).currency_code", balance).currency_code == "USD")
|
||||||
|
end
|
||||||
|
```
|
||||||
|
|
||||||
|
To install it, add `AshMoney.AshPostgresExtension` to your list of `installed_extensions` in your repo, and generate migrations.
|
||||||
|
|
||||||
|
```elixir
|
||||||
|
defmodule YourRepo do
|
||||||
|
def installed_extensions do
|
||||||
|
[..., AshMoney.AshPostgresExtension]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
```
|
||||||
|
|
||||||
|
## AshGraphql Support
|
||||||
|
|
||||||
|
Add the following to your schema file:
|
||||||
|
|
||||||
|
```elixir
|
||||||
|
object :money do
|
||||||
|
field(:amount, non_null(:decimal))
|
||||||
|
field(:currency, non_null(:string))
|
||||||
|
end
|
||||||
|
```
|
8
lib/ash_money.ex
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
defmodule AshMoney do
|
||||||
|
@moduledoc """
|
||||||
|
`AshMoney` provides a type for working with money in your Ash resources.
|
||||||
|
|
||||||
|
It also provides an `AshPostgres.Extension` that can be used to add support for
|
||||||
|
money types and operators to your Postgres database.
|
||||||
|
"""
|
||||||
|
end
|
26
lib/ash_money/ash_postgres_extension.ex
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
if Code.ensure_loaded?(AshPostgres.CustomExtension) do
|
||||||
|
defmodule AshMoney.AshPostgresExtension do
|
||||||
|
@moduledoc """
|
||||||
|
Installs the `money_with_currency` type and operators/functions for Postgres.
|
||||||
|
"""
|
||||||
|
use AshPostgres.CustomExtension, name: :ash_money, latest_version: 1
|
||||||
|
|
||||||
|
def install(1) do
|
||||||
|
"""
|
||||||
|
#{Money.DDL.execute_each(Money.DDL.create_money_with_currency())}
|
||||||
|
#{Money.DDL.execute_each(Money.DDL.define_plus_operator())}
|
||||||
|
#{Money.DDL.execute_each(Money.DDL.define_minmax_functions())}
|
||||||
|
#{Money.DDL.execute_each(Money.DDL.define_sum_function())}
|
||||||
|
"""
|
||||||
|
end
|
||||||
|
|
||||||
|
def uninstall(1) do
|
||||||
|
"""
|
||||||
|
#{Money.DDL.execute_each(Money.DDL.drop_sum_function())}
|
||||||
|
#{Money.DDL.execute_each(Money.DDL.drop_minmax_functions())}
|
||||||
|
#{Money.DDL.execute_each(Money.DDL.drop_plus_operator())}
|
||||||
|
#{Money.DDL.execute_each(Money.DDL.drop_money_with_currency())}
|
||||||
|
"""
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
103
lib/ash_money/types/money.ex
Normal file
|
@ -0,0 +1,103 @@
|
||||||
|
defmodule AshMoney.Types.Money do
|
||||||
|
@moduledoc """
|
||||||
|
A money type for Ash that uses the `ex_money` library.
|
||||||
|
"""
|
||||||
|
use Ash.Type
|
||||||
|
|
||||||
|
@impl Ash.Type
|
||||||
|
def constraints do
|
||||||
|
[
|
||||||
|
storage_type: [
|
||||||
|
type: :atom,
|
||||||
|
default: :money_with_currency,
|
||||||
|
doc: "The storage type for the money value. Can be `:money_with_currency` or `:map`."
|
||||||
|
]
|
||||||
|
]
|
||||||
|
end
|
||||||
|
|
||||||
|
@impl true
|
||||||
|
def cast_in_query?(constraints) do
|
||||||
|
Keyword.get(constraints, :storage_type, :money_with_currency) == :money_with_currency
|
||||||
|
end
|
||||||
|
|
||||||
|
@impl Ash.Type
|
||||||
|
def storage_type(constraints) do
|
||||||
|
if constraints[:items] do
|
||||||
|
Keyword.get(constraints[:items], :storage_type, :money_with_currency)
|
||||||
|
else
|
||||||
|
Keyword.get(constraints, :storage_type, :money_with_currency)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
@impl Ash.Type
|
||||||
|
def cast_input(nil, _constraints), do: {:ok, nil}
|
||||||
|
|
||||||
|
def cast_input({amount, currency}, constraints) do
|
||||||
|
case Money.new(amount, currency) do
|
||||||
|
{:error, error} -> {:error, error}
|
||||||
|
money -> cast_input(money, constraints)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def cast_input(value, constraints) do
|
||||||
|
if constraints[:storage_type] == :map do
|
||||||
|
Money.Ecto.Map.Type.cast(value)
|
||||||
|
else
|
||||||
|
Money.Ecto.Composite.Type.cast(value)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
@impl Ash.Type
|
||||||
|
def cast_stored(nil, _), do: {:ok, nil}
|
||||||
|
def cast_stored(%Money{} = value, _), do: {:ok, value}
|
||||||
|
|
||||||
|
def cast_stored({_amount, _currency} = value, _constraints),
|
||||||
|
do: Money.Ecto.Composite.Type.load(value)
|
||||||
|
|
||||||
|
def cast_stored(value, _constraints) do
|
||||||
|
Money.Ecto.Map.Type.load(value)
|
||||||
|
end
|
||||||
|
|
||||||
|
@impl Ash.Type
|
||||||
|
def dump_to_embedded(nil, _constraints), do: {:ok, nil}
|
||||||
|
|
||||||
|
def dump_to_embedded(value, _constraints) do
|
||||||
|
Money.Ecto.Map.Type.dump(value)
|
||||||
|
end
|
||||||
|
|
||||||
|
@impl Ash.Type
|
||||||
|
def dump_to_native(nil, _constraints), do: {:ok, nil}
|
||||||
|
|
||||||
|
def dump_to_native(value, constraints) do
|
||||||
|
if constraints[:storage_type] == :map do
|
||||||
|
Money.Ecto.Map.Type.dump(value)
|
||||||
|
else
|
||||||
|
Money.Ecto.Composite.Type.dump(value)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if Code.ensure_loaded?(AshGraphql.Type) do
|
||||||
|
@behaviour AshGraphql.Type
|
||||||
|
@spec graphql_type(term()) :: atom()
|
||||||
|
def graphql_type(_), do: :money
|
||||||
|
|
||||||
|
@spec graphql_input_type(term()) :: atom()
|
||||||
|
def graphql_input_type(_), do: :money_input
|
||||||
|
end
|
||||||
|
|
||||||
|
if Code.ensure_loaded?(AshPostgres.Type) do
|
||||||
|
@behaviour AshPostgres.Type
|
||||||
|
|
||||||
|
@impl AshPostgres.Type
|
||||||
|
def value_to_postgres_default(__MODULE__, constraints, %Money{
|
||||||
|
amount: amount,
|
||||||
|
currency: currency
|
||||||
|
}) do
|
||||||
|
if Keyword.get(constraints, :storage_type, :money_with_currency) == :map do
|
||||||
|
{:ok, ~s[fragment("'{\\"amount\\": #{amount}, \\"currency\\": \\"#{currency}\\"}'")]}
|
||||||
|
else
|
||||||
|
{:ok, ~s[fragment("('#{currency}', #{amount})")]}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
1
logos/.gitkeep
Normal file
|
@ -0,0 +1 @@
|
||||||
|
|
27
logos/ascii-art.ans
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
[107;40m[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m([38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
|
||||||
|
[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m*[38;5;203m([38;5;203m([38;5;203m([38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
|
||||||
|
[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;m([38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
|
||||||
|
[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
|
||||||
|
[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
|
||||||
|
[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;m/[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
|
||||||
|
[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
|
||||||
|
[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;m([38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
|
||||||
|
[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m([38;5;209m#[38;5;209m#[38;5;m([38;5;m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
|
||||||
|
[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m#[38;5;m([38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;m#[38;5;m [38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;m([38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
|
||||||
|
[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m([38;5;215m#[38;5;m [38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;m#[38;5;m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;m.[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
|
||||||
|
[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;215m#[38;5;215m#[38;5;m [38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;m [38;5;m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;m([38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
|
||||||
|
[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m#[38;5;215m#[38;5;215m#[38;5;m*[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;m#[38;5;m,[38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;m,[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
|
||||||
|
[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;215m#[38;5;215m#[38;5;215m#[38;5;m#[38;5;m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;m [38;5;m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
|
||||||
|
[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;m#[38;5;m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;m [38;5;215m#[38;5;215m#[38;5;m [38;5;m [38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;m([38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
|
||||||
|
[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m,[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;m#[38;5;m([38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;m.[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;m/[38;5;209m#[38;5;m#[38;5;m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
|
||||||
|
[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;m.[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;m#[38;5;m [38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;m#[38;5;m([38;5;209m#[38;5;m#[38;5;m [38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;m([38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
|
||||||
|
[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;m [38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;m [38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;m [38;5;209m#[38;5;209m#[38;5;209m#[38;5;m#[38;5;m*[38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
|
||||||
|
[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;m.[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;m#[38;5;m [38;5;m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;m#[38;5;m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;m [38;5;m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;m([38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
|
||||||
|
[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;m#[38;5;m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;m#[38;5;m,[38;5;215m#[38;5;m*[38;5;203m([38;5;203m([38;5;m/[38;5;m,[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;m#[38;5;m.[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;m#[38;5;m*[38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;m*[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
|
||||||
|
[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m.[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;m#[38;5;m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;m#[38;5;m [38;5;215m#[38;5;215m#[38;5;m#[38;5;m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;m [38;5;m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;m.[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;m [38;5;m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
|
||||||
|
[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;m#[38;5;m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;m#[38;5;m.[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;m/[38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;m([38;5;m [38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;m#[38;5;m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;m#[38;5;m [38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;m*[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
|
||||||
|
[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m/[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;m.[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;m#[38;5;m/[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;m [38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;m/[38;5;m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;m [38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;m/[38;5;m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
|
||||||
|
[38;5;m [38;5;m [38;5;m [38;5;m [38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;m [38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;m#[38;5;m,[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;m [38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;m([38;5;m [38;5;m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;m#[38;5;m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;m [38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;m([38;5;m [38;5;m [38;5;m
|
||||||
|
[38;5;m [38;5;m [38;5;m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;m [38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;m#[38;5;m,[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;m.[38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;m*[38;5;m%[38;5;215m#[38;5;m#[38;5;m,[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;m#[38;5;m/[38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;m,[38;5;m
|
||||||
|
[38;5;m [38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;m [38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;m#[38;5;m([38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;215m#[38;5;m#[38;5;m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;203m([38;5;m([38;5;m [38;5;m [38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;209m#[38;5;m [38;5;m([38;5;203m([38;5;203m([38;5;m(
|
||||||
|
[0m
|
19
logos/ash-auth-logo.svg
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
<svg width="939" height="741" viewBox="0 0 939 741" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M470.482 294L743.966 741H729.078L394.43 418.305L470.482 294Z" fill="#FF5757"/>
|
||||||
|
<path d="M296.391 741H328.49L500.904 533.333L392.216 428.527L296.391 741Z" fill="#FF914D"/>
|
||||||
|
<path d="M431.037 741H340.052L432.58 629.553L431.037 741Z" fill="#FFBD59"/>
|
||||||
|
<path d="M439.934 741H606.641L441.62 619.199L439.934 741Z" fill="#FF5757"/>
|
||||||
|
<path d="M625.59 741L513.772 545.742L716.263 741H625.59Z" fill="#FF914D"/>
|
||||||
|
<path d="M610.739 732.969L447.037 612.141L502.967 544.774L610.739 732.969Z" fill="#FFBD59"/>
|
||||||
|
<path d="M287.086 741H196.999L377.62 445.78L287.086 741Z" fill="#FFBD59"/>
|
||||||
|
<path d="M470.482 294L766.5 741H729.078L394.43 418.305L470.482 294Z" fill="#FF5757"/>
|
||||||
|
<path d="M610.739 732.969L447.037 612.141L502.967 544.774L610.739 732.969Z" fill="#FFBD59"/>
|
||||||
|
<path d="M196.999 725.5L218.5 689L366 448.5H269.5L196.999 725.5Z" fill="#FF5757"/>
|
||||||
|
<path d="M197 688.5L197 294L260.5 441.5L197 688.5Z" fill="#FFBD59"/>
|
||||||
|
<path d="M763.305 317.27L763.305 690.5L710.805 510.77L763.305 317.27Z" fill="#FF5757"/>
|
||||||
|
<path d="M764.5 720L481 294L633.5 294L764.5 720Z" fill="#FFBD59"/>
|
||||||
|
<path d="M218.5 295L458.5 295L380 427.5L218.5 295Z" fill="#FFBD59"/>
|
||||||
|
<path d="M205 294L378.56 439.5L270.5 439.5L205 294Z" fill="#FF914D"/>
|
||||||
|
<path d="M641.439 294L763 294L705 500L641.439 294Z" fill="#FF914D"/>
|
||||||
|
<path d="M321 251.125V189.375C321 148.432 337.264 109.166 366.215 80.2154C395.166 51.2645 434.432 35 475.375 35C516.318 35 555.584 51.2645 584.535 80.2154C613.486 109.166 629.75 148.432 629.75 189.375V251.125" stroke="#FF5757" stroke-width="70" stroke-linecap="square" stroke-linejoin="round"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.6 KiB |
BIN
logos/ash-colored-wordmark.png
Normal file
After Width: | Height: | Size: 41 KiB |
11
logos/ash-colored-wordmark.svg
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
<svg width="688" height="925" viewBox="0 0 688 925" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M335.379 0L670.76 548.168H652.5L242.115 152.438L335.379 0Z" fill="#FF5757"/>
|
||||||
|
<path d="M121.886 548.168H161.251L372.687 293.501L239.399 164.974L121.886 548.168Z" fill="#FF914D"/>
|
||||||
|
<path d="M287.007 548.168H175.43L288.899 411.498L287.007 548.168Z" fill="#FFBD59"/>
|
||||||
|
<path d="M297.917 548.168H502.355L299.985 398.8L297.917 548.168Z" fill="#FF5757"/>
|
||||||
|
<path d="M525.591 548.168L388.467 308.718L636.784 548.168H525.591Z" fill="#FF914D"/>
|
||||||
|
<path d="M507.38 538.319L306.627 390.144L375.216 307.531L507.38 538.319Z" fill="#FFBD59"/>
|
||||||
|
<path d="M110.476 548.168H0L221.5 186.132L110.476 548.168Z" fill="#FFBD59"/>
|
||||||
|
<path d="M23.4496 868.311H57.7361V874.242H23.4496V868.311ZM24.1909 901.763H17.3336V836.897H61.8134V842.828H24.1909V901.763ZM75.974 901.763V836.897H100.252C105.751 836.897 110.477 837.793 114.43 839.584C118.384 841.314 121.411 843.847 123.512 847.183C125.674 850.457 126.755 854.442 126.755 859.137C126.755 863.709 125.674 867.662 123.512 870.998C121.411 874.272 118.384 876.805 114.43 878.597C110.477 880.327 105.751 881.192 100.252 881.192H79.7733L82.8312 878.041V901.763H75.974ZM120.268 901.763L103.588 878.226H111.002L127.774 901.763H120.268ZM82.8312 878.597L79.7733 875.354H100.067C106.554 875.354 111.465 873.933 114.801 871.091C118.199 868.249 119.898 864.265 119.898 859.137C119.898 853.948 118.199 849.932 114.801 847.09C111.465 844.249 106.554 842.828 100.067 842.828H79.7733L82.8312 839.584V878.597ZM132.561 901.763L162.214 836.897H168.979L198.632 901.763H191.404L164.16 840.882H166.94L139.696 901.763H132.561ZM144.237 884.435L146.276 878.875H183.991L186.03 884.435H144.237ZM209.363 901.763V836.897H215.015L244.668 887.493H241.703L271.078 836.897H276.731V901.763H270.152V847.183H271.727L244.668 893.516H241.425L214.181 847.183H215.942V901.763H209.363ZM303.982 865.902H338.268V871.74H303.982V865.902ZM304.723 895.833H343.736V901.763H297.866V836.897H342.346V842.828H304.723V895.833ZM373.684 901.763L351.814 836.897H358.857L379.336 897.964H375.815L396.943 836.897H403.244L424.094 897.964H420.758L441.423 836.897H448.002L426.133 901.763H418.905L398.982 843.847H400.835L380.819 901.763H373.684ZM488.388 902.319C483.507 902.319 478.967 901.516 474.766 899.91C470.627 898.242 467.013 895.925 463.924 892.96C460.897 889.933 458.518 886.443 456.789 882.489C455.121 878.473 454.287 874.087 454.287 869.33C454.287 864.573 455.121 860.218 456.789 856.264C458.518 852.249 460.897 848.758 463.924 845.793C467.013 842.766 470.627 840.449 474.766 838.843C478.905 837.175 483.446 836.341 488.388 836.341C493.268 836.341 497.778 837.175 501.917 838.843C506.056 840.449 509.639 842.735 512.666 845.7C515.755 848.666 518.134 852.156 519.802 856.172C521.531 860.187 522.396 864.573 522.396 869.33C522.396 874.087 521.531 878.473 519.802 882.489C518.134 886.504 515.755 889.995 512.666 892.96C509.639 895.925 506.056 898.242 501.917 899.91C497.778 901.516 493.268 902.319 488.388 902.319ZM488.388 896.203C492.28 896.203 495.863 895.555 499.137 894.257C502.473 892.898 505.346 891.014 507.755 888.605C510.226 886.134 512.141 883.292 513.5 880.08C514.859 876.805 515.539 873.222 515.539 869.33C515.539 865.438 514.859 861.886 513.5 858.674C512.141 855.399 510.226 852.558 507.755 850.148C505.346 847.677 502.473 845.793 499.137 844.496C495.863 843.137 492.28 842.457 488.388 842.457C484.496 842.457 480.882 843.137 477.546 844.496C474.21 845.793 471.306 847.677 468.835 850.148C466.426 852.558 464.511 855.399 463.09 858.674C461.731 861.886 461.051 865.438 461.051 869.33C461.051 873.16 461.731 876.713 463.09 879.987C464.511 883.261 466.426 886.134 468.835 888.605C471.306 891.014 474.21 892.898 477.546 894.257C480.882 895.555 484.496 896.203 488.388 896.203ZM537.766 901.763V836.897H562.045C567.543 836.897 572.269 837.793 576.223 839.584C580.177 841.314 583.204 843.847 585.304 847.183C587.466 850.457 588.548 854.442 588.548 859.137C588.548 863.709 587.466 867.662 585.304 870.998C583.204 874.272 580.177 876.805 576.223 878.597C572.269 880.327 567.543 881.192 562.045 881.192H541.566L544.624 878.041V901.763H537.766ZM582.061 901.763L565.381 878.226H572.794L589.567 901.763H582.061ZM544.624 878.597L541.566 875.354H561.86C568.346 875.354 573.258 873.933 576.594 871.091C579.991 868.249 581.69 864.265 581.69 859.137C581.69 853.948 579.991 849.932 576.594 847.09C573.258 844.249 568.346 842.828 561.86 842.828H541.566L544.624 839.584V878.597ZM610.663 885.64L610.385 877.3L649.675 836.897H657.552L628.918 866.921L625.026 871.091L610.663 885.64ZM604.732 901.763V836.897H611.59V901.763H604.732ZM651.343 901.763L623.358 869.516L627.991 864.512L659.498 901.763H651.343Z" fill="#FF5757"/>
|
||||||
|
<path d="M18.5379 812L126.612 571.836H170.528L278.945 812H232.284L139.306 595.509H157.147L64.5122 812H18.5379ZM68.2862 756.419L80.2944 721.424H209.983L221.991 756.419H68.2862ZM360.306 814.402C344.981 814.402 330.228 812.457 316.047 808.569C302.094 804.452 291.001 799.534 282.767 793.816L299.235 761.222C307.47 766.483 317.305 770.829 328.741 774.26C340.178 777.691 351.614 779.406 363.05 779.406C376.545 779.406 386.266 777.576 392.213 773.917C398.389 770.257 401.477 765.339 401.477 759.164C401.477 754.132 399.418 750.358 395.301 747.842C391.184 745.097 385.809 743.039 379.176 741.666C372.543 740.294 365.109 739.036 356.875 737.892C348.869 736.748 340.75 735.262 332.515 733.432C324.51 731.373 317.191 728.514 310.557 724.855C303.924 720.966 298.549 715.82 294.432 709.415C290.315 703.011 288.256 694.548 288.256 684.027C288.256 672.362 291.573 662.298 298.206 653.835C304.839 645.143 314.103 638.51 325.997 633.935C338.119 629.132 352.415 626.73 368.883 626.73C381.234 626.73 393.7 628.103 406.28 630.847C418.86 633.592 429.267 637.481 437.501 642.513L421.033 675.106C412.341 669.846 403.535 666.3 394.615 664.47C385.923 662.412 377.232 661.383 368.54 661.383C355.502 661.383 345.782 663.327 339.377 667.215C333.201 671.104 330.114 676.021 330.114 681.968C330.114 687.458 332.172 691.575 336.289 694.319C340.406 697.064 345.782 699.237 352.415 700.838C359.048 702.439 366.367 703.812 374.373 704.955C382.607 705.87 390.727 707.357 398.732 709.415C406.738 711.474 414.057 714.333 420.69 717.993C427.552 721.424 433.041 726.341 437.158 732.746C441.275 739.15 443.334 747.499 443.334 757.791C443.334 769.228 439.903 779.178 433.041 787.64C426.408 796.103 416.916 802.737 404.565 807.54C392.213 812.114 377.46 814.402 360.306 814.402ZM584.224 626.73C598.863 626.73 611.9 629.589 623.337 635.308C635.002 641.026 644.151 649.832 650.784 661.726C657.417 673.391 660.734 688.487 660.734 707.014V812H617.847V712.503C617.847 696.264 613.959 684.141 606.182 676.136C598.634 668.13 587.998 664.127 574.275 664.127C564.211 664.127 555.29 666.186 547.513 670.303C539.737 674.42 533.675 680.596 529.329 688.83C525.212 696.835 523.154 707.014 523.154 719.365V812H480.267V557.426H523.154V678.194L513.89 663.098C520.295 651.433 529.558 642.513 541.681 636.337C554.032 629.932 568.213 626.73 584.224 626.73Z" fill="#FFBD59"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 6.8 KiB |
9
logos/ash_logo_black.svg
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
<svg width="123" height="100" viewBox="0 0 123 100" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M61.1819 0L122.364 100H119.033L44.1681 27.8086L61.1819 0Z" fill="black"/>
|
||||||
|
<path d="M22.2352 100H29.4163L67.9877 53.5421L43.6726 30.0954L22.2352 100Z" fill="black"/>
|
||||||
|
<path d="M52.3575 100H32.0029L52.7027 75.0678L52.3575 100Z" fill="black"/>
|
||||||
|
<path d="M54.3478 100H91.6425L54.725 72.7514L54.3478 100Z" fill="black"/>
|
||||||
|
<path d="M95.8815 100L70.8665 56.3181L116.166 100H95.8815Z" fill="black"/>
|
||||||
|
<path d="M92.5593 98.2033L55.9368 71.1724L68.4492 56.1016L92.5593 98.2033Z" fill="black"/>
|
||||||
|
<path d="M20.1537 100H0L40.4074 33.9553L20.1537 100Z" fill="black"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 665 B |
9
logos/ash_logo_orange.svg
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
<svg width="123" height="100" viewBox="0 0 123 100" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M61.1819 0L122.364 100H119.033L44.1681 27.8086L61.1819 0Z" fill="#FF5757"/>
|
||||||
|
<path d="M22.2352 100H29.4163L67.9877 53.5421L43.6726 30.0954L22.2352 100Z" fill="#FF914D"/>
|
||||||
|
<path d="M52.3575 100H32.0029L52.7027 75.0678L52.3575 100Z" fill="#FFBD59"/>
|
||||||
|
<path d="M54.3478 100H91.6425L54.725 72.7514L54.3478 100Z" fill="#FF5757"/>
|
||||||
|
<path d="M95.8815 100L70.8665 56.3181L116.166 100H95.8815Z" fill="#FF914D"/>
|
||||||
|
<path d="M92.5593 98.2033L55.9368 71.1724L68.4492 56.1016L92.5593 98.2033Z" fill="#FFBD59"/>
|
||||||
|
<path d="M20.1537 100H0L40.4074 33.9553L20.1537 100Z" fill="#FFBD59"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 679 B |
9
logos/ash_logo_pride.svg
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="123" height="100" fill="none">
|
||||||
|
<path fill="#FF5757" d="m61.182 0 61.182 100h-3.331L44.168 27.809 61.182 0Z" style="fill:#e50000;fill-opacity:1"/>
|
||||||
|
<path fill="#FF914D" d="M22.235 100h7.181l38.572-46.458-24.315-23.447L22.235 100Z" style="fill:#004cff;fill-opacity:1"/>
|
||||||
|
<path fill="#FFBD59" d="M52.358 100H32.002l20.7-24.932L52.357 100Z" style="fill:#000;fill-opacity:1"/>
|
||||||
|
<path fill="#FF5757" d="M54.348 100h37.294L54.725 72.751 54.348 100Z" style="fill:#028121;fill-opacity:1"/>
|
||||||
|
<path fill="#FF914D" d="M95.882 100 70.865 56.318l45.3 43.682H95.882Z" style="fill:#ff8d00;fill-opacity:1"/>
|
||||||
|
<path fill="#FFBD59" d="m92.56 98.203-36.623-27.03 12.512-15.071 24.11 42.101Z" style="fill:#fe0;fill-opacity:1"/>
|
||||||
|
<path fill="#FFBD59" d="M20.154 100H0l40.407-66.045L20.154 100Z" style="fill:#708;fill-opacity:1"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 884 B |
9
logos/ash_logo_trans.svg
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="123" height="100" fill="none">
|
||||||
|
<path fill="#FF5757" d="m61.182 0 61.182 100h-3.331L44.168 27.809 61.182 0Z" style="fill:#5bcefa;fill-opacity:1"/>
|
||||||
|
<path fill="#FF914D" d="M22.235 100h7.181l38.572-46.458-24.315-23.447L22.235 100Z" style="fill:#f5a9b8;fill-opacity:1"/>
|
||||||
|
<path fill="#FFBD59" d="M52.358 100H32.002l20.7-24.932L52.357 100Z" style="fill:#fff;fill-opacity:1"/>
|
||||||
|
<path fill="#FF5757" d="M54.348 100h37.294L54.725 72.751 54.348 100Z" style="fill:#5bcefa;fill-opacity:1"/>
|
||||||
|
<path fill="#FF914D" d="M95.882 100 70.865 56.318l45.3 43.682H95.882Z" style="fill:#f5a9b8;fill-opacity:1"/>
|
||||||
|
<path fill="#FFBD59" d="m92.56 98.203-36.623-27.03 12.512-15.071 24.11 42.101Z" style="fill:#fff;fill-opacity:1"/>
|
||||||
|
<path fill="#FFBD59" d="M20.154 100H0l40.407-66.045L20.154 100Z" style="fill:#5bcefa;fill-opacity:1"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 887 B |
9
logos/ash_logo_white.svg
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
<svg width="123" height="100" viewBox="0 0 123 100" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M61.1819 0L122.364 100H119.033L44.1681 27.8086L61.1819 0Z" fill="white"/>
|
||||||
|
<path d="M22.2352 100H29.4163L67.9877 53.5421L43.6726 30.0954L22.2352 100Z" fill="white"/>
|
||||||
|
<path d="M52.3575 100H32.0029L52.7027 75.0678L52.3575 100Z" fill="white"/>
|
||||||
|
<path d="M54.3478 100H91.6425L54.725 72.7514L54.3478 100Z" fill="white"/>
|
||||||
|
<path d="M95.8815 100L70.8665 56.3181L116.166 100H95.8815Z" fill="white"/>
|
||||||
|
<path d="M92.5593 98.2033L55.9368 71.1724L68.4492 56.1016L92.5593 98.2033Z" fill="white"/>
|
||||||
|
<path d="M20.1537 100H0L40.4074 33.9553L20.1537 100Z" fill="white"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 665 B |
BIN
logos/ashley.png
Normal file
After Width: | Height: | Size: 228 KiB |
44
logos/ashley.svg
Normal file
After Width: | Height: | Size: 721 KiB |
BIN
logos/cropped-for-header-black-text.png
Normal file
After Width: | Height: | Size: 14 KiB |
BIN
logos/cropped-for-header-white-text.png
Normal file
After Width: | Height: | Size: 18 KiB |
BIN
logos/logo-black-text.png
Normal file
After Width: | Height: | Size: 18 KiB |
BIN
logos/logo-only.png
Normal file
After Width: | Height: | Size: 24 KiB |
BIN
logos/logo-white-text.png
Normal file
After Width: | Height: | Size: 18 KiB |
BIN
logos/small-logo.png
Normal file
After Width: | Height: | Size: 3 KiB |
178
mix.exs
Normal file
|
@ -0,0 +1,178 @@
|
||||||
|
defmodule AshMoney.MixProject do
|
||||||
|
use Mix.Project
|
||||||
|
|
||||||
|
@version "0.1.0"
|
||||||
|
|
||||||
|
@description """
|
||||||
|
Money extension for Ash.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def project do
|
||||||
|
[
|
||||||
|
app: :ash_money,
|
||||||
|
version: @version,
|
||||||
|
elixir: "~> 1.15",
|
||||||
|
start_permanent: Mix.env() == :prod,
|
||||||
|
deps: deps(),
|
||||||
|
aliases: aliases(),
|
||||||
|
package: package(),
|
||||||
|
elixirc_paths: elixirc_paths(Mix.env()),
|
||||||
|
dialyzer: [plt_add_apps: [:ash]],
|
||||||
|
test_coverage: [tool: ExCoveralls],
|
||||||
|
preferred_cli_env: [
|
||||||
|
coveralls: :test,
|
||||||
|
"coveralls.github": :test
|
||||||
|
],
|
||||||
|
docs: docs(),
|
||||||
|
description: @description,
|
||||||
|
source_url: "https://github.com/ash-project/ash_money",
|
||||||
|
homepage_url: "https://github.com/ash-project/ash_money"
|
||||||
|
]
|
||||||
|
end
|
||||||
|
|
||||||
|
# Run "mix help compile.app" to learn about applications.
|
||||||
|
def application do
|
||||||
|
[
|
||||||
|
extra_applications: [:logger]
|
||||||
|
]
|
||||||
|
end
|
||||||
|
|
||||||
|
defp package do
|
||||||
|
[
|
||||||
|
name: :ash_money,
|
||||||
|
licenses: ["MIT"],
|
||||||
|
files: ~w(lib .formatter.exs mix.exs README* LICENSE*
|
||||||
|
CHANGELOG* documentation),
|
||||||
|
links: %{
|
||||||
|
GitHub: "https://github.com/ash-project/ash_money"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
end
|
||||||
|
|
||||||
|
defp elixirc_paths(:test) do
|
||||||
|
elixirc_paths(:dev) ++ ["test/support"]
|
||||||
|
end
|
||||||
|
|
||||||
|
defp elixirc_paths(_) do
|
||||||
|
["lib"]
|
||||||
|
end
|
||||||
|
|
||||||
|
defp extras() do
|
||||||
|
"documentation/**/*.{md,livemd,cheatmd}"
|
||||||
|
|> Path.wildcard()
|
||||||
|
|> Enum.map(fn path ->
|
||||||
|
title =
|
||||||
|
path
|
||||||
|
|> Path.basename(".md")
|
||||||
|
|> Path.basename(".livemd")
|
||||||
|
|> Path.basename(".cheatmd")
|
||||||
|
|> String.split(~r/[-_]/)
|
||||||
|
|> Enum.map_join(" ", &capitalize/1)
|
||||||
|
|> case do
|
||||||
|
"F A Q" ->
|
||||||
|
"FAQ"
|
||||||
|
|
||||||
|
other ->
|
||||||
|
other
|
||||||
|
end
|
||||||
|
|
||||||
|
{String.to_atom(path),
|
||||||
|
[
|
||||||
|
title: title
|
||||||
|
]}
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
|
||||||
|
defp capitalize(string) do
|
||||||
|
string
|
||||||
|
|> String.split(" ")
|
||||||
|
|> Enum.map(fn string ->
|
||||||
|
[hd | tail] = String.graphemes(string)
|
||||||
|
String.capitalize(hd) <> Enum.join(tail)
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
|
||||||
|
defp groups_for_extras() do
|
||||||
|
[
|
||||||
|
Tutorials: [
|
||||||
|
~r'documentation/tutorials'
|
||||||
|
],
|
||||||
|
"How To": ~r'documentation/how_to',
|
||||||
|
Topics: ~r'documentation/topics',
|
||||||
|
DSLs: ~r'documentation/dsls'
|
||||||
|
]
|
||||||
|
end
|
||||||
|
|
||||||
|
defp docs do
|
||||||
|
[
|
||||||
|
main: "get-started-with-ash-money",
|
||||||
|
source_ref: "v#{@version}",
|
||||||
|
logo: "logos/small-logo.png",
|
||||||
|
extra_section: "GUIDES",
|
||||||
|
before_closing_head_tag: fn type ->
|
||||||
|
if type == :html do
|
||||||
|
"""
|
||||||
|
<script>
|
||||||
|
if (location.hostname === "hexdocs.pm") {
|
||||||
|
var script = document.createElement("script");
|
||||||
|
script.src = "https://plausible.io/js/script.js";
|
||||||
|
script.setAttribute("defer", "defer")
|
||||||
|
script.setAttribute("data-domain", "ashhexdocs")
|
||||||
|
document.head.appendChild(script);
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
"""
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
extras: extras(),
|
||||||
|
groups_for_extras: groups_for_extras(),
|
||||||
|
groups_for_modules: [
|
||||||
|
AshMoney: [
|
||||||
|
AshMoney,
|
||||||
|
AshMoney.Types.Money
|
||||||
|
],
|
||||||
|
AshPostgres: [
|
||||||
|
AshMoney.AshPostgresExtension
|
||||||
|
],
|
||||||
|
Internals: ~r/.*/
|
||||||
|
]
|
||||||
|
]
|
||||||
|
end
|
||||||
|
|
||||||
|
# Run "mix help deps" to learn about dependencies.
|
||||||
|
defp deps do
|
||||||
|
[
|
||||||
|
{:ash, ash_version("~> 2.0")},
|
||||||
|
{:ex_money, "~> 5.15"},
|
||||||
|
{:ex_money_sql, "~> 1.0", optional: true},
|
||||||
|
{:ex_doc, github: "elixir-lang/ex_doc", only: [:dev, :test], runtime: false},
|
||||||
|
{:ex_check, "~> 0.12", only: [:dev, :test]},
|
||||||
|
{:credo, ">= 0.0.0", only: [:dev, :test], runtime: false},
|
||||||
|
{:dialyxir, ">= 0.0.0", only: [:dev, :test], runtime: false},
|
||||||
|
{:sobelow, ">= 0.0.0", only: [:dev, :test], runtime: false},
|
||||||
|
{:git_ops, "~> 2.5", only: [:dev, :test]},
|
||||||
|
{:excoveralls, "~> 0.13", only: [:dev, :test]},
|
||||||
|
{:mix_test_watch, "~> 1.0", only: :dev, runtime: false}
|
||||||
|
]
|
||||||
|
end
|
||||||
|
|
||||||
|
defp aliases do
|
||||||
|
[
|
||||||
|
sobelow: "sobelow --skip",
|
||||||
|
credo: "credo --strict",
|
||||||
|
docs: [
|
||||||
|
"docs",
|
||||||
|
"spark.replace_doc_links"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
end
|
||||||
|
|
||||||
|
defp ash_version(default_version) do
|
||||||
|
case System.get_env("ASH_VERSION") do
|
||||||
|
nil -> default_version
|
||||||
|
"local" -> [path: "../ash"]
|
||||||
|
"main" -> [git: "https://github.com/ash-project/ash.git"]
|
||||||
|
version -> "~> #{version}"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
44
mix.lock
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
%{
|
||||||
|
"ash": {:hex, :ash, "2.17.4", "b672ab9bcd7351e9adb3bf332655b6c777bab6c45e7cb88b3a89117f6a200837", [:mix], [{:comparable, "~> 1.0", [hex: :comparable, repo: "hexpm", optional: false]}, {:decimal, "~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:earmark, "~> 1.4", [hex: :earmark, repo: "hexpm", optional: false]}, {:ecto, "~> 3.7", [hex: :ecto, repo: "hexpm", optional: false]}, {:ets, "~> 0.8", [hex: :ets, repo: "hexpm", optional: false]}, {:jason, ">= 1.0.0", [hex: :jason, repo: "hexpm", optional: false]}, {:picosat_elixir, "~> 0.2", [hex: :picosat_elixir, repo: "hexpm", optional: false]}, {:plug, ">= 0.0.0", [hex: :plug, repo: "hexpm", optional: true]}, {:spark, ">= 1.1.50 and < 2.0.0-0", [hex: :spark, repo: "hexpm", optional: false]}, {:stream_data, "~> 0.6", [hex: :stream_data, repo: "hexpm", optional: false]}, {:telemetry, "~> 1.1", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "941d9edf1ba3511e3a3c40711de168ee476197fa0615f15b16548178e1d50e97"},
|
||||||
|
"bunt": {:hex, :bunt, "0.2.1", "e2d4792f7bc0ced7583ab54922808919518d0e57ee162901a16a1b6664ef3b14", [:mix], [], "hexpm", "a330bfb4245239787b15005e66ae6845c9cd524a288f0d141c148b02603777a5"},
|
||||||
|
"cldr_utils": {:hex, :cldr_utils, "2.24.2", "364fa30be55d328e704629568d431eb74cd2f085752b27f8025520b566352859", [:mix], [{:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:certifi, "~> 2.5", [hex: :certifi, repo: "hexpm", optional: true]}, {:decimal, "~> 1.9 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}], "hexpm", "3362b838836a9f0fa309de09a7127e36e67310e797d556db92f71b548832c7cf"},
|
||||||
|
"comparable": {:hex, :comparable, "1.0.0", "bb669e91cedd14ae9937053e5bcbc3c52bb2f22422611f43b6e38367d94a495f", [:mix], [{:typable, "~> 0.1", [hex: :typable, repo: "hexpm", optional: false]}], "hexpm", "277c11eeb1cd726e7cd41c6c199e7e52fa16ee6830b45ad4cdc62e51f62eb60c"},
|
||||||
|
"credo": {:hex, :credo, "1.7.1", "6e26bbcc9e22eefbff7e43188e69924e78818e2fe6282487d0703652bc20fd62", [:mix], [{:bunt, "~> 0.2.1", [hex: :bunt, repo: "hexpm", optional: false]}, {:file_system, "~> 0.2.8", [hex: :file_system, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "e9871c6095a4c0381c89b6aa98bc6260a8ba6addccf7f6a53da8849c748a58a2"},
|
||||||
|
"db_connection": {:hex, :db_connection, "2.6.0", "77d835c472b5b67fc4f29556dee74bf511bbafecdcaf98c27d27fa5918152086", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "c2f992d15725e721ec7fbc1189d4ecdb8afef76648c746a8e1cad35e3b8a35f3"},
|
||||||
|
"decimal": {:hex, :decimal, "2.1.1", "5611dca5d4b2c3dd497dec8f68751f1f1a54755e8ed2a966c2633cf885973ad6", [:mix], [], "hexpm", "53cfe5f497ed0e7771ae1a475575603d77425099ba5faef9394932b35020ffcc"},
|
||||||
|
"dialyxir": {:hex, :dialyxir, "1.4.2", "764a6e8e7a354f0ba95d58418178d486065ead1f69ad89782817c296d0d746a5", [:mix], [{:erlex, ">= 0.2.6", [hex: :erlex, repo: "hexpm", optional: false]}], "hexpm", "516603d8067b2fd585319e4b13d3674ad4f314a5902ba8130cd97dc902ce6bbd"},
|
||||||
|
"digital_token": {:hex, :digital_token, "0.6.0", "13e6de581f0b1f6c686f7c7d12ab11a84a7b22fa79adeb4b50eec1a2d278d258", [:mix], [{:cldr_utils, "~> 2.17", [hex: :cldr_utils, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "2455d626e7c61a128b02a4a8caddb092548c3eb613ac6f6a85e4cbb6caddc4d1"},
|
||||||
|
"earmark": {:hex, :earmark, "1.4.46", "8c7287bd3137e99d26ae4643e5b7ef2129a260e3dcf41f251750cb4563c8fb81", [:mix], [], "hexpm", "798d86db3d79964e759ddc0c077d5eb254968ed426399fbf5a62de2b5ff8910a"},
|
||||||
|
"earmark_parser": {:hex, :earmark_parser, "1.4.39", "424642f8335b05bb9eb611aa1564c148a8ee35c9c8a8bba6e129d51a3e3c6769", [:mix], [], "hexpm", "06553a88d1f1846da9ef066b87b57c6f605552cfbe40d20bd8d59cc6bde41944"},
|
||||||
|
"ecto": {:hex, :ecto, "3.11.0", "ff8614b4e70a774f9d39af809c426def80852048440e8785d93a6e91f48fec00", [:mix], [{:decimal, "~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "7769dad267ef967310d6e988e92d772659b11b09a0c015f101ce0fff81ce1f81"},
|
||||||
|
"ecto_sql": {:hex, :ecto_sql, "3.11.0", "c787b24b224942b69c9ff7ab9107f258ecdc68326be04815c6cce2941b6fad1c", [:mix], [{:db_connection, "~> 2.4.1 or ~> 2.5", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.11.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.6.0", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.16.0 or ~> 0.17.0 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1 or ~> 2.2", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "77aa3677169f55c2714dda7352d563002d180eb33c0dc29cd36d39c0a1a971f5"},
|
||||||
|
"elixir_make": {:hex, :elixir_make, "0.7.7", "7128c60c2476019ed978210c245badf08b03dbec4f24d05790ef791da11aa17c", [:mix], [{:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}], "hexpm", "5bc19fff950fad52bbe5f211b12db9ec82c6b34a9647da0c2224b8b8464c7e6c"},
|
||||||
|
"erlex": {:hex, :erlex, "0.2.6", "c7987d15e899c7a2f34f5420d2a2ea0d659682c06ac607572df55a43753aa12e", [:mix], [], "hexpm", "2ed2e25711feb44d52b17d2780eabf998452f6efda104877a3881c2f8c0c0c75"},
|
||||||
|
"ets": {:hex, :ets, "0.9.0", "79c6a6c205436780486f72d84230c6cba2f8a9920456750ddd1e47389107d5fd", [:mix], [], "hexpm", "2861fdfb04bcaeff370f1a5904eec864f0a56dcfebe5921ea9aadf2a481c822b"},
|
||||||
|
"ex_check": {:hex, :ex_check, "0.15.0", "074b94c02de11c37bba1ca82ae5cc4926e6ccee862e57a485b6ba60fca2d8dc1", [:mix], [], "hexpm", "33848031a0c7e4209c3b4369ce154019788b5219956220c35ca5474299fb6a0e"},
|
||||||
|
"ex_cldr": {:hex, :ex_cldr, "2.37.5", "9da6d97334035b961d2c2de167dc6af8cd3e09859301a5b8f49f90bd8b034593", [:mix], [{:cldr_utils, "~> 2.21", [hex: :cldr_utils, repo: "hexpm", optional: false]}, {:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:gettext, "~> 0.19", [hex: :gettext, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:nimble_parsec, "~> 0.5 or ~> 1.0", [hex: :nimble_parsec, repo: "hexpm", optional: true]}], "hexpm", "74ad5ddff791112ce4156382e171a5f5d3766af9d5c4675e0571f081fe136479"},
|
||||||
|
"ex_cldr_currencies": {:hex, :ex_cldr_currencies, "2.15.1", "e92ba17c41e7405b7784e0e65f406b5f17cfe313e0e70de9befd653e12854822", [:mix], [{:ex_cldr, "~> 2.34", [hex: :ex_cldr, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "31df8bd37688340f8819bdd770eb17d659652078d34db632b85d4a32864d6a25"},
|
||||||
|
"ex_cldr_numbers": {:hex, :ex_cldr_numbers, "2.32.3", "b631ff94c982ec518e46bf4736000a30a33d6b58facc085d5f240305f512ad4a", [:mix], [{:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:digital_token, "~> 0.3 or ~> 1.0", [hex: :digital_token, repo: "hexpm", optional: false]}, {:ex_cldr, "~> 2.37", [hex: :ex_cldr, repo: "hexpm", optional: false]}, {:ex_cldr_currencies, ">= 2.14.2", [hex: :ex_cldr_currencies, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "7b626ff1e59a0ec9c3c5db5ce9ca91a6995e2ab56426b71f3cbf67181ea225f5"},
|
||||||
|
"ex_doc": {:git, "https://github.com/elixir-lang/ex_doc.git", "ae05a4f0791ce5463e28595ff39407b45d2b8b5c", []},
|
||||||
|
"ex_money": {:hex, :ex_money, "5.15.2", "660139ab73313c2c9ca9b7b4496bbee62e6b0ba87780d2a9af135e0e8a2c6feb", [:mix], [{:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:ex_cldr_numbers, "~> 2.31", [hex: :ex_cldr_numbers, repo: "hexpm", optional: false]}, {:gringotts, "~> 1.1", [hex: :gringotts, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:nimble_parsec, "~> 0.5 or ~> 1.0", [hex: :nimble_parsec, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.0 or ~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:poison, "~> 3.0 or ~> 4.0 or ~> 5.0", [hex: :poison, repo: "hexpm", optional: true]}], "hexpm", "59b96d83afa69070c595c9afd78ed0802e211c8741a5644e05ee44567f480845"},
|
||||||
|
"ex_money_sql": {:hex, :ex_money_sql, "1.10.1", "5c0981b29de1e6cd4ef06b5480ceb08525620d9b4939caa52eb1a0deefc7c71a", [:mix], [{:ecto, "~> 3.5", [hex: :ecto, repo: "hexpm", optional: false]}, {:ecto_sql, "~> 3.0", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:ex_money, "~> 5.7", [hex: :ex_money, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.15", [hex: :postgrex, repo: "hexpm", optional: false]}], "hexpm", "75439d10272369a38fc52bb1dc251982d65aca77a0f3ce422e8927f782df43f9"},
|
||||||
|
"excoveralls": {:hex, :excoveralls, "0.18.0", "b92497e69465dc51bc37a6422226ee690ab437e4c06877e836f1c18daeb35da9", [:mix], [{:castore, "~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "1109bb911f3cb583401760be49c02cbbd16aed66ea9509fc5479335d284da60b"},
|
||||||
|
"file_system": {:hex, :file_system, "0.2.10", "fb082005a9cd1711c05b5248710f8826b02d7d1784e7c3451f9c1231d4fc162d", [:mix], [], "hexpm", "41195edbfb562a593726eda3b3e8b103a309b733ad25f3d642ba49696bf715dc"},
|
||||||
|
"git_cli": {:hex, :git_cli, "0.3.0", "a5422f9b95c99483385b976f5d43f7e8233283a47cda13533d7c16131cb14df5", [:mix], [], "hexpm", "78cb952f4c86a41f4d3511f1d3ecb28edb268e3a7df278de2faa1bd4672eaf9b"},
|
||||||
|
"git_ops": {:hex, :git_ops, "2.6.0", "e0791ee1cf5db03f2c61b7ebd70e2e95cba2bb9b9793011f26609f22c0900087", [:mix], [{:git_cli, "~> 0.2", [hex: :git_cli, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.0", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "b98fca849b18aaf490f4ac7d1dd8c6c469b0cc3e6632562d366cab095e666ffe"},
|
||||||
|
"jason": {:hex, :jason, "1.4.1", "af1504e35f629ddcdd6addb3513c3853991f694921b1b9368b0bd32beb9f1b63", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "fbb01ecdfd565b56261302f7e1fcc27c4fb8f32d56eab74db621fc154604a7a1"},
|
||||||
|
"makeup": {:hex, :makeup, "1.1.1", "fa0bc768698053b2b3869fa8a62616501ff9d11a562f3ce39580d60860c3a55e", [:mix], [{:nimble_parsec, "~> 1.2.2 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "5dc62fbdd0de44de194898b6710692490be74baa02d9d108bc29f007783b0b48"},
|
||||||
|
"makeup_elixir": {:hex, :makeup_elixir, "0.16.1", "cc9e3ca312f1cfeccc572b37a09980287e243648108384b97ff2b76e505c3555", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.2.3 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "e127a341ad1b209bd80f7bd1620a15693a9908ed780c3b763bccf7d200c767c6"},
|
||||||
|
"makeup_erlang": {:hex, :makeup_erlang, "0.1.2", "ad87296a092a46e03b7e9b0be7631ddcf64c790fa68a9ef5323b6cbb36affc72", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "f3f5a1ca93ce6e092d92b6d9c049bcda58a3b617a8d888f8e7231c85630e8108"},
|
||||||
|
"mix_test_watch": {:hex, :mix_test_watch, "1.1.1", "eee6fc570d77ad6851c7bc08de420a47fd1e449ef5ccfa6a77ef68b72e7e51ad", [:mix], [{:file_system, "~> 0.2.1 or ~> 0.3", [hex: :file_system, repo: "hexpm", optional: false]}], "hexpm", "f82262b54dee533467021723892e15c3267349849f1f737526523ecba4e6baae"},
|
||||||
|
"nimble_options": {:hex, :nimble_options, "1.0.2", "92098a74df0072ff37d0c12ace58574d26880e522c22801437151a159392270e", [:mix], [], "hexpm", "fd12a8db2021036ce12a309f26f564ec367373265b53e25403f0ee697380f1b8"},
|
||||||
|
"nimble_parsec": {:hex, :nimble_parsec, "1.4.0", "51f9b613ea62cfa97b25ccc2c1b4216e81df970acd8e16e8d1bdc58fef21370d", [:mix], [], "hexpm", "9c565862810fb383e9838c1dd2d7d2c437b3d13b267414ba6af33e50d2d1cf28"},
|
||||||
|
"picosat_elixir": {:hex, :picosat_elixir, "0.2.3", "bf326d0f179fbb3b706bb2c15fbc367dacfa2517157d090fdfc32edae004c597", [:make, :mix], [{:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "f76c9db2dec9d2561ffaa9be35f65403d53e984e8cd99c832383b7ab78c16c66"},
|
||||||
|
"postgrex": {:hex, :postgrex, "0.17.3", "c92cda8de2033a7585dae8c61b1d420a1a1322421df84da9a82a6764580c503d", [:mix], [{:db_connection, "~> 2.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:table, "~> 0.1.0", [hex: :table, repo: "hexpm", optional: true]}], "hexpm", "946cf46935a4fdca7a81448be76ba3503cff082df42c6ec1ff16a4bdfbfb098d"},
|
||||||
|
"sobelow": {:hex, :sobelow, "0.13.0", "218afe9075904793f5c64b8837cc356e493d88fddde126a463839351870b8d1e", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "cd6e9026b85fc35d7529da14f95e85a078d9dd1907a9097b3ba6ac7ebbe34a0d"},
|
||||||
|
"sourceror": {:hex, :sourceror, "0.14.1", "c6fb848d55bd34362880da671debc56e77fd722fa13b4dcbeac89a8998fc8b09", [:mix], [], "hexpm", "8b488a219e4c4d7d9ff29d16346fd4a5858085ccdd010e509101e226bbfd8efc"},
|
||||||
|
"spark": {:hex, :spark, "1.1.51", "8458de5abbb89d18dd5c9235dd39e3757076eba84a5078d1cdc2c1e23c39aa95", [:mix], [{:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: false]}, {:nimble_options, "~> 0.5 or ~> 1.0", [hex: :nimble_options, repo: "hexpm", optional: false]}, {:sourceror, "~> 0.1", [hex: :sourceror, repo: "hexpm", optional: false]}], "hexpm", "ed8410aa8db08867b8fff3d65e54deeb7f6f6cf2b8698fc405a386c1c7a9e4f0"},
|
||||||
|
"stream_data": {:hex, :stream_data, "0.6.0", "e87a9a79d7ec23d10ff83eb025141ef4915eeb09d4491f79e52f2562b73e5f47", [:mix], [], "hexpm", "b92b5031b650ca480ced047578f1d57ea6dd563f5b57464ad274718c9c29501c"},
|
||||||
|
"telemetry": {:hex, :telemetry, "1.2.1", "68fdfe8d8f05a8428483a97d7aab2f268aaff24b49e0f599faa091f1d4e7f61c", [:rebar3], [], "hexpm", "dad9ce9d8effc621708f99eac538ef1cbe05d6a874dd741de2e689c47feafed5"},
|
||||||
|
"typable": {:hex, :typable, "0.3.0", "0431e121d124cd26f312123e313d2689b9a5322b15add65d424c07779eaa3ca1", [:mix], [], "hexpm", "880a0797752da1a4c508ac48f94711e04c86156f498065a83d160eef945858f8"},
|
||||||
|
}
|
4
test/ash_money_test.exs
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
defmodule AshMoneyTest do
|
||||||
|
use ExUnit.Case
|
||||||
|
doctest AshMoney
|
||||||
|
end
|
1
test/test_helper.exs
Normal file
|
@ -0,0 +1 @@
|
||||||
|
ExUnit.start()
|