diff --git a/comparison.md b/comparison.md deleted file mode 100644 index 3893260..0000000 --- a/comparison.md +++ /dev/null @@ -1,63 +0,0 @@ -# Comparison of Transity and Hledger Entries - -## A transity entry: a transaction made of up four "transfers": - -```yaml -utc: '2016-04-16 18:50:28' -tags: [domain] -note: 1 year registration of domain "ferambot.com" -transfers: - - from: adrian:hypo:giro - to: paypal - amount: 9.94 € - transaction-id: '24360863' - - from: paypal - to: namecheap - amount: 10.87 $ - - from: namecheap - to: icann - amount: 0.18 $ - tag: [fee] - - from: namecheap - to: feram - amount: 1 domain-year - note: ferambot.com -``` - - -## Possible Translations to Hledger: - -### Version A - -```ledger -2016-04-16 1 year registration of domain "ferambot.com" ; domain: - adrian:hypo:giro -9.94 € - paypal 9.94 € ; transaction-id: 24360863 - paypal -10.87 $ - namecheap 10.87 $ - namecheap -0.18 $ - icann 0.18 $ ; fee: - namecheap -1 domain-year - feram 1 domain-year ; note: ferambot.com -``` - - -## Version B - -```ledger -2016-04-16 1 year registration of domain "ferambot.com" ; domain:, transaction-id: 24360863 - adrian:hypo:giro - paypal 9.94 € - -2016-04-16 1 year registration of domain "ferambot.com" ; domain: - paypal - namecheap 10.87 $ - -2016-04-16 1 year registration of domain "ferambot.com" ; domain:, fee: - namecheap - icann 0.18 $ - -2016-04-16 1 year registration of domain "ferambot.com" ; domain:, note: ferambot.com - namecheap - feram 1 domain-year -``` diff --git a/docs_src/00_Features.md b/docs_src/00_Features.md new file mode 100644 index 0000000..dd5dfab --- /dev/null +++ b/docs_src/00_Features.md @@ -0,0 +1,33 @@ +## Features + +- Easily editable and processable file format based on [YAML] +- Modeled on transactions instead of debiting / crediting accounts \ + → Support for complex transactions made up of several transfers + - Dedicated payer (from) and payee (to) fields (ledger only supports payee) +- No misuse of accounts as categories / tags \ + → Direct support for tags +- Clear separation between + - Physical account (e.g. wallet, bank account) + - Entities (e.g. my mum, a company) + - Purpose of transaction (e.g. food, travel) +- No hard-coded asset / liability connotation as it is viewpoint dependent \ + → Choose viewpoint by setting the owner of the journal +- Initial balances +- High precision timestamps in ISO 8601 format +- Reference external files (e.g. receipts, contracts, bank statements, …) +- Safety checks + - BigInt fractional numbers to eliminate rounding errors + - Verifies exclusive use of predefined entities + - Checks in transactions match with verification balances + - Checks that referenced external files exist + and that all external files are referenced +- Export to other formats for post-processing + - [Gnuplot] - For trends + - [(H)ledger Format] - For using (H)ledger exclusive features + - CSV and TSV - For further processing in spreadsheet software + - XLSX aka Excel - For further processing in spreadsheet software +- Multi file support + +[YAML]: http://yaml.org +[Gnuplot]: http://www.gnuplot.info +[(H)ledger Format]: http://hledger.org/journal.html diff --git a/docs_src/01_Installation.md b/docs_src/01_Installation.md new file mode 100644 index 0000000..670e770 --- /dev/null +++ b/docs_src/01_Installation.md @@ -0,0 +1,18 @@ +## Installation + +Transity is distributed as a JavaScript bundle and can therefore +be installed via [npm](https://npmjs.com): + +```sh +npm install --global transity +``` + +or via [Yarn](https://yarnpkg.com): +```sh +yarn global add transity +``` + +or via [Bun](https://bun.sh): +```sh +bun install --global transity +``` diff --git a/docs_src/02_Usage.md b/docs_src/02_Usage.md new file mode 100644 index 0000000..5386d0b --- /dev/null +++ b/docs_src/02_Usage.md @@ -0,0 +1,161 @@ +## Usage + +### Journal File Format + +A minimal journal file is a YAML file with following format: + +```yaml +owner: anna +commodities: + - id: € + name: Euro + alias: + - EUR + note: Currency used in the European Union + utc: '2017-04-02 19:33:53' + +entities: + - id: anna + name: Anna Smith + utc: '2017-04-02 19:33:28' + tags: + - person + accounts: + - id: wallet + name: Wallet + note: Anna's black wallet + utc: '2017-04-02 19:33:28' + tags: + - wallet + + - id: evil-corp + name: Evil Corporation + utc: '2017-04-02 19:33:28' + note: The Evil Corporation in the United States of Evil + tags: + - company + +transactions: + - title: Purchase of evil machine + transfers: + - utc: '2017-02-17' + from: anna + to: evil-corp + amount: 50000 € + - utc: '2017-02-17' + from: evil-corp + to: anna + amount: 1 evil-machine +``` + + +### Analyzing Journal Files + +#### Balance + +```shell +$ transity balance examples/journal.yaml + anna 1 evil-machine + -49978.02 € + ben -50 $ + -1.432592 BTC + -100 € + evil-corp -1 evil-machine + 50015 € + good-inc -100 € + grocery-shop 11.97 € + john 371.04 € + 50 $ + 1.432592 BTC + :default 219.99 € + giro 50 $ + 1.432592 BTC + 85 € + wallet 66.05 € +``` + +If linked modules aren't exposed in your path you can also run + +```shell +cli/main.js balance examples/journal.yaml +``` + + +#### Help + +List complete usage manual by simply calling `transity` without any arguments. + +```shell +$ transity + +Usage: transity + +Command Description +------------------ ------------------------------------------------------------ +balance Simple balance of all accounts +transactions All transactions and their transfers +transfers All transfers with one transfer per line +entries All individual deposits & withdrawals +entries-by-account All individual deposits & withdrawals grouped by account +gplot Code and data for gnuplot impulse diagram + to visualize transfers of all accounts +gplot-cumul Code and data for cumuluative gnuplot step chart + to visualize balance of all accounts +``` + + +#### Transfers + +Screenshot Transfers + + +#### Plotting + +By default all accounts are plotted. +To limit it to only a subsection use `awk` to filter the output. + +For example all transactions of Euro accounts: + +```bash +transity gplot examples/journal.yaml \ +| awk '/^$/ || /(EOD|^set terminal)/ || /€/' \ +| gnuplot \ +| imgcat +``` + +Or all account balances of Euro accounts over time: + +```bash +transity gplot-cumul examples/journal.yaml \ +| awk '/^$/ || /(EOD|^set terminal)/ || /€/' \ +| gnuplot \ +| imgcat +``` + +![Screenshot of cumulative account balance plot](./images/screenshot-plot.png) + + +### Scripts + +Useful scripts leveraging other command line tools. + +#### Check Order of Entries + +Check if all entries are in a chronological order + +```sh +ag --nonumbers "^ utc:" journals/main.yaml | tr -d "\'" | sort -c +``` + + +### Tutorials + +- [cs007.blog] - Personal finance for engineers. +- [principlesofaccounting.com] - Online tutorial on accounting. + +[cs007.blog]: https://cs007.blog +[principlesofaccounting.com]: https://www.principlesofaccounting.com diff --git a/docs_src/03_Import.md b/docs_src/03_Import.md new file mode 100644 index 0000000..e7cae4a --- /dev/null +++ b/docs_src/03_Import.md @@ -0,0 +1,77 @@ +## Import + +### AI Powered + +We built a dedicated OpenAI GPT to convert any financial data +(e.g. CSVs, bank statements, chat history, …) to a Transity journal file. + +Check it out at +[chat.openai.com/g/g-aUph953Vj-transity]( + https://chat.openai.com/g/g-aUph953Vj-transity). + + +### From Ledger CLI + +Execute the included ledger2transity script: + +```shell +./ledger2transity.sh examples/hledger.journal > transactions.csv +``` + +Convert `transactions.csv` to YAML with e.g. [browserling.com/tools/csv-to-yaml] + +[browserling.com/tools/csv-to-yaml]: https://browserling.com/tools/csv-to-yaml + + +**Attention:** + +- Merge adjacent entries as each entry only debits / credits an account. + A transaction always involves 2 accounts (`from` and `to`). + (For expenses basically copy the ledger-account from the second entry + into the `from` field of the first entry) +- `from` and `to` might be reversed for income + (depending on how the `payee` field was used) +- Account names of Ledger-CLI are interpreted as tags + Transity understands accounts as **physical accounts** +- The note is duplicated in the `tags` field. + There is no way to get only the tags in Ledger-CLI 😔 + + +### Scripts + +Transity includes a few scripts located at [./scripts](./scripts) to +automate a Chrome browser to download data. + + +### Retrieving Data from Banks + +It supports downloading CSV files of all +transactions and converting them to journal +files and retrieving the current account balance: + +```sh +node scripts/transactions/hypovereinsbank.js > transactions.yaml +``` + +This will prompt you for your credentials and afterwards automate +a headless Chrome instance to download and convert the data. + +Currently supported accounts for transactions: + +- [DKB Visa Card](https://dkb.de) +- [DKB Giro Account](https://dkb.de) +- [HypoVereinsbank](https://www.hypovereinsbank.de) +- [MBS](https://mbs.de) + +Currently supported accounts for balances: + +- [AWS](https://aws.amazon.com) +- [DKB](https://dkb.de) +- [Fidor](https://fidor.de) +- [Finvesto](https://finvesto.de) +- [HypoVereinsbank](https://www.hypovereinsbank.de) +- [MBS](https://mbs.de) +- [PayPal](https://paypal.com) +- [Deutsche Post Petty Cash](https://portokasse.deutschepost.de) + +Contributions are very welcome! diff --git a/docs_src/04_FAQ.md b/docs_src/04_FAQ.md new file mode 100644 index 0000000..6be4ca1 --- /dev/null +++ b/docs_src/04_FAQ.md @@ -0,0 +1,91 @@ +## FAQ + +### Why another plain text accounting tool? + +Existing accounting tools are historically based on the notion of an account. +You add money (debit) and you remove money (credit). +(If this sounds backwards to you, read [this explanation]) + +[this explanation]: + http://simplerestaurantaccounting.com/debit-and-credit-accounting-terminology-is-confusing + +For example you get 50 € from your mum and buy some food for 20 €. + +```txt +Account | Debit | Credit +--------|-------|-------- +Wallet | 50 € | +Wallet | | 20 € +``` + +Simple, but also incomplete. +Where did the money come from, where did it go? +This led to double entry bookkeeping. +Whenever you add some money to an account, +you have to remove the same amount from another. + + +```txt +Account | Debit | Credit +--------|-------|-------- +Wallet | 50 € | +Mum | | 50 € +Wallet | | 20 € +Food | 20 € | +``` + +But you *must never forget a posting*, +because otherwise your account won't balance. + +```txt +Account | Debit | Credit +--------|-------|-------- +Wallet | 50 € | +Mum | | 50 € +Wallet | | 20 € +``` + +Oops, where did the money go? 🤷‍ + +If this looks (and sounds) confusing or too complicated, you're not alone! +It made sense in former times as this layout makes it easier +to add up the amounts by hand, but not in times of computers. + +So how can we simplify it? +It's actually quite easy: +We just have to model it in terms of transactions, and not accounts. + +```txt +From | To | Amount +-------|--------|-------- +Mum | Wallet | 50 € +Wallet | Food | 20 € +``` + +- **Simple** - No more confusing debit / credit / asset / liability mumbo jumbo +- **Intuitive** - Just like you would talk about it +- **Safe** - It's obvious if you forget to fill out a field + +Together with some further changes it yields an +**easier to understand, more robust and more complete** +representation of accounting! + + +### Why is it written in PureScript? + +[PureScript](https://www.purescript.org/) leverages strong static typing +and can therefore give more guarantees about the functionality of the code +than weakly typed or untyped languages like JavaScript. + +You wouldn't want your money to get lost in rounding errors or +be turned to `undefined`, would you? 😉 + + +### Why is it not written in Haskell? + +PureScript can also easily be used in the browser or get deployed +as a cloud function as it simply compiles to JavaScript. +With Haskell you'd have to use another language for a web frontend +or quarrel with experimental stuff like [GHC's WebAssembly backend][ghc-wasm]. + +[ghc-wasm]: https://downloads.haskell.org/ghc/latest/docs/users_guide/wasm.html diff --git a/docs_src/05_Related.md b/docs_src/05_Related.md new file mode 100644 index 0000000..cdc5a1b --- /dev/null +++ b/docs_src/05_Related.md @@ -0,0 +1,41 @@ +## Related + +For a full list of plain text accounting tools check out +[plaintextaccounting.org](https://plaintextaccounting.org). +Here are some of the links +that are especially relevant for Transity: + + +### Other Plain Text Accounting Tools + +- [Ledger] - The original command line accounting tool (written in C++). +- [Hledger] - Ledger clone with a focus on UX, reliability, + and real-world practicality (written in Haskell). +- [Beancount] - Double-entry accounting from text files (written in Python). +- [Rust Ledger] - Ledger clone that uses YAML as well (written in Rust). + +[Beancount]: https://beancount.github.io +[Hledger]: https://hledger.org +[Ledger]: https://ledger-cli.org +[Rust Ledger]: https://github.com/ebcrowder/rust_ledger + + +### Other Finance Management Apps + +- [Cashtrackr] - Manage and visualize finances. +- [Copilot] - Track spending, budgets, investments, and net worth. +- [Empower] - Budget planner. +- [Fidelity] - Financial planning, wealth management, trading, and brokerage. +- [Monarch] - Track your account balances, transactions, and investments. +- [Roi] - All-in-one investing platform to track & trade existing accounts. +- [Track Your Dividends] - Track your dividend portfolio and its performance. +- [YNAB] - Budgeting software for personal finance. + +[Cashtrackr]: https://cashtrackr.app/ +[Copilot]: https://copilot.money/ +[Empower]: https://empower.me/ +[Fidelity]: https://www.fidelity.com/ +[Monarch]: https://www.monarchmoney.com/ +[Roi]: https://getroi.app/ +[Track Your Dividends]: https://trackyourdividends.com/ +[YNAB]: https://www.ynab.com/ diff --git a/docs_src/06_Comparison.md b/docs_src/06_Comparison.md new file mode 100644 index 0000000..d95c008 --- /dev/null +++ b/docs_src/06_Comparison.md @@ -0,0 +1,175 @@ +## Comparison + +[Ledger] and [Hledger]'s transactions are a (balanced) group of account postings. +Transity's transactions are a group of transfers between two accounts. + +[Ledger]: https://www.ledger-cli.org/ +[Hledger]: https://hledger.org/ + + +### Syntax + +Checkout the files [hledger.journal] and [journal.yaml] +for similar transactions modeled in Hledger and in Transity. + +[hledger.journal]: ./examples/hledger.journal +[journal.yaml]: ./examples/journal.yaml + +There is a lot of ambiguity in the ledger journal format. +Are you able to tell the difference between the 2 options? + + +```ledger +2019-01-17 Bought food + expenses:food $10 + assets:cash +``` + +vs + +```ledger +2019-01-17 Bought food + assets:cash + expenses:food $10 +``` + +Also, it lacks some fields for more precise recording +of which parties where involved. + +- What food? +- Where did you buy it? +- When exactly did you buy it? +- Which supermarket? + +```ledger +2019-01-17 Bought food + expenses:food $10 + assets:cash +``` + +#### Example + +A Transity entry as a transaction made of up four transfers: + +```yaml +utc: '2024-04-16 18:50:28' +tags: [domain] +note: 1 year registration of domain "ad-si.com" +transfers: + - from: adrian:hypo:giro + to: paypal + amount: 9.94 € + transaction-id: '24360863' + + - from: paypal + to: namecheap + amount: 10.87 $ + + - from: namecheap + to: icann + amount: 0.18 $ + tag: [fee] + + - from: namecheap + to: feram + amount: 1 domain-year + note: ad-si.com +``` + + +**Possible Translations to Hledger:** + +**Version A:** + +```ledger +2024-04-16 1 year registration of domain "ad-si.com" ; domain: + adrian:hypo:giro -9.94 € + paypal 9.94 € ; transaction-id: 24360863 + paypal -10.87 $ + namecheap 10.87 $ + namecheap -0.18 $ + icann 0.18 $ ; fee: + namecheap -1 domain-year + feram 1 domain-year ; note: ad-si.com +``` + +**Version B**: + +```ledger +2024-04-16 1 year registration of domain "ad-si.com" ; domain:, transaction-id: 24360863 + adrian:hypo:giro + paypal 9.94 € + +2024-04-16 1 year registration of domain "ad-si.com" ; domain: + paypal + namecheap 10.87 $ + +2024-04-16 1 year registration of domain "ad-si.com" ; domain:, fee: + namecheap + icann 0.18 $ + +2024-04-16 1 year registration of domain "ad-si.com" ; domain:, note: ad-si.com + namecheap + feram 1 domain-year +``` + + +### Reporting + +```shell +hledger --file examples/hledger.journal balance +# vs +transity balance examples/journal.yaml +``` + +```shell +hledger --file examples/hledger.journal register +# vs +transity transactions examples/journal.yaml +``` + +```shell +hledger --file examples/hledger.journal register --output-format=csv +# vs +transity entries examples/journal.yaml +``` + + +### Features + +Several features are missing in Ledger and Hledger: + +- No support for precise timestamps (transactions only have an associated date) +- No first class support for Gnuplot + (Check out [Report Scripts for Ledger CLI with Gnuplot] for some scripts) + +[Report Scripts for Ledger CLI with Gnuplot]: + https://www.sundialdreams.com/report-scripts-for-ledger-cli-with-gnuplot + + +### Performance + +Measured with hyperfine including 3 warmups on an early 2015 MacBook Pro. + +*For a journal file with around 2000 entries:* + +Transity: +```txt +Benchmark #1: transity balance journals/main.yaml + Time (mean ± σ): 1.287 s ± 0.021 s [User: 1.790 s, System: 0.140 s] + Range (min … max): 1.250 s … 1.324 s 10 runs +``` + +Hledger: +```txt +Benchmark #1: hledger -f test.ledger balance + Time (mean ± σ): 409.6 ms ± 6.1 ms [User: 366.6 ms, System: 28.5 ms] + Range (min … max): 398.8 ms … 417.6 ms 10 runs +``` + +Ledger: +```txt +Benchmark #1: ledger -f test.ledger balance + Time (mean ± σ): 76.3 ms ± 9.1 ms [User: 62.7 ms, System: 9.4 ms] + Range (min … max): 65.1 ms … 101.8 ms 28 runs +``` diff --git a/database-backend.md b/docs_src/07_Ideas.md similarity index 56% rename from database-backend.md rename to docs_src/07_Ideas.md index e40e094..21c8d8f 100644 --- a/database-backend.md +++ b/docs_src/07_Ideas.md @@ -1,14 +1,85 @@ -# Database Backend - -**Attention: Work in progress** - -Alternatively the data can be stored in a database -so that the YAML file is only produced temporarily for viewing - - -## Relational Data Structure - -### Commodities +## Ideas + +- Features for duplicates + - Print list of possible duplicates + - Label an entry explicitly as a duplicate to store it in several places +- CSV import +- Dashboard +- Budgets (including progress visualization) +- Cache-files to speed up processing of large data sets +- Generate EPC QR Codes for transfers +- LSP server for journal files +- Export to [Graphviz] (for account / entity relations) +- Export to [JS-Sequence-Diagrams] (sequence of transactions) +- Meta data for all entities (transactions, accounts, entities, …) +- Nanosecond precision for timestamps +- Additional features for crypto currencies +- Commodities + - Treat as scientific units (e.g 1 k€ == 1000 €) + - First class support for any type of commodity (e.g. time and messages) + - Support for time limited commodities (e.g. subscription for a month) + - Define which are allowed / prohibited for each account + - Hard vs Soft vs Fungible vs … +- Differentiation between transfers, transactions & exchanges + - Special syntax for exchanges +- Support for all states of transaction life cycle + 1. Request - Request to exchange a commodity + 1. Offer - Specification of commodity & expected trade item + 1. Acceptance - Affirmation of interest in offered exchange + 1. Fulfillments + 1. Certification - Acknowledgment that exchange was performed + +[Graphviz]: https://graphviz.org +[JS-Sequence-Diagrams]: https://bramp.github.io/js-sequence-diagrams + + +### Entry / Value Date + +There are no separate fields for entry or value dates necessary. +Simply use ISO 8601 [time intervals] to specify the duration of a transfer. + +[time intervals]: https://en.wikipedia.org/wiki/ISO_8601#Time_intervals + +```yaml +transactions: + - id: '123456789' + note: Deposit of savings + transfers: + - utc: 2018-01-04T12:00--05T22:10 + from: john + to: bank + amount: 100 € +``` + + +### Syntax + +This is a first concept of an alternative syntax for the journal file: + +```transity +# Comments after a hash + +2016-04-16 18:50:28 +| 1 year registration of domain "example.org" ++tagOne # Tags are written after a plus ++tagTwo +id: 20135604 # Arbitrary metadata +# Transactions are indentend by 2 spaces + john -> paypal : 9.95 € + paypal -> namecheap : {10 + 0.69} $ + paypal -> icann : 0.18 $ +fee + namecheap -> john : 1 Domain +``` + +### Database Backend + +Alternatively the data could be stored in a database +so that the YAML file is only produced temporarily for viewing. + + +#### Relational Data Structure + +##### Commodities A commodity can be anything with can be assigned a quantity or amount. E.g. money, time, pigs, cows, coordinates, messages. @@ -35,7 +106,7 @@ A table of commodities looks like this: | … | … | … | … | -### Transfers +##### Transfers Movement of a commodity from one account to another at a specific point in time. End datetime is optional and matches the start datetime if missing. @@ -58,7 +129,7 @@ Continuation: -### Transactions +##### Transactions Several related transfers which balance each other. A transaction has following stages: @@ -85,7 +156,7 @@ continuation … | … | … | -### Accounts +##### Accounts An account is an entity which can store / contain / use commodities. @@ -98,7 +169,7 @@ A table of accounts looks like this: | … | … | … | … | -### Tags +##### Tags A tag is a category / value which can be associated with an account or a transfer. diff --git a/changelog.md b/docs_src/08_Changelog.md similarity index 93% rename from changelog.md rename to docs_src/08_Changelog.md index 046a142..47e8bc2 100644 --- a/changelog.md +++ b/docs_src/08_Changelog.md @@ -1,9 +1,9 @@ -# Changelog +## Changelog This changelog only contains user facing changes of the app. -## [WIP] 0.9.0 +### Current Main - Don't list commodities with an amount of 0 in `balance` command - Show only owner's balance with `balance` @@ -19,7 +19,7 @@ This changelog only contains user facing changes of the app. - FIX: Correctly filter accounts with an empty commodity map -## 0.8.0 (2020-09-09) +### 0.8.0 (2020-09-09) - Add CLI command to show version number ([5f9cc03]) - Add csv2yaml scripts for MBS and PayPal ([d1b4840]) @@ -36,7 +36,7 @@ This changelog only contains user facing changes of the app. [a6fbf8b]: https://github.com/feramhq/transity/commit/a6fbf8b -## 0.7.0 (2020-02-18) +### 0.7.0 (2020-02-18) - Improve normalization of crawled transactions ([ac78c05]) - Improve scripts for transactions loading & parsing ([c7c558e]) @@ -47,7 +47,7 @@ This changelog only contains user facing changes of the app. [8dde588]: https://github.com/feramhq/transity/commit/8dde588 -## 0.6.0 (2019-10-20) +### 0.6.0 (2019-10-20) - Add comparison between Transity and Hledger entries ([acf219b]) - Add screenshots ([acf219b]) @@ -55,7 +55,7 @@ This changelog only contains user facing changes of the app. [acf219b]: https://github.com/feramhq/transity/commit/acf219b -## 0.5.0 (2019-05-04) +### 0.5.0 (2019-05-04) - Deploy simple web version of Transity at [feram.io/transity] (5cc24f6) - Fix several typos and grammatical errors (0f670a7) @@ -63,20 +63,20 @@ This changelog only contains user facing changes of the app. [feram.io/transity]: https://www.feram.io/transity -## 0.4.2 (2019-04-26) +### 0.4.2 (2019-04-26) - Only add relevant files to npm package (1c9dc47) - Update dependencies (83992a7) -## 0.4.1 (2019-04-26) +### 0.4.1 (2019-04-26) - Simplify installation by pre-building Transity and only delivering the built files in the npm package (459d3c0) - Add a changelog (c33e03b) -## 0.4.0 (2019-04-25) +### 0.4.0 (2019-04-25) - Add scripts to retrieve the balance and transactions from several German banks (097eb93, 204874e) @@ -89,20 +89,20 @@ This changelog only contains user facing changes of the app. - Fix `npm install` by using psc-package instead of bower (5cada63) -## 0.3.0 (2018-09-10) +### 0.3.0 (2018-09-10) - Add command `transfers` (3ae89fc) - Add command `ledger-entries` to export to the ledger file format (4be8374) - Add commands `csv` and `tsv` to print entries in as CSV / TSV (8587e22) -## 0.2.1 (2018-06-05) +### 0.2.1 (2018-06-05) - Fix test command for CI, fix typos (ac81a8e) - Fix references (42f17b3) -## 0.2.0 (2018-06-05) +### 0.2.0 (2018-06-05) - Don't coerce invalid dates to 1970-01-01 (07f99f5) - Add `gplot` subcommands to allow piping to gnuplot (c25b445) @@ -113,7 +113,7 @@ This changelog only contains user facing changes of the app. - Implement alignment of entries (bfa602f) -## 0.1.0-alpha (2018-01-18) +### 0.1.0-alpha (2018-01-18) - Indent entries in balance only as deep as necessary (bcc61a7) - Disallow accounts with empty ids, improve error messages (af22b62) diff --git a/contributing.md b/docs_src/09_Contributing.md similarity index 90% rename from contributing.md rename to docs_src/09_Contributing.md index 620cbc4..923b972 100644 --- a/contributing.md +++ b/docs_src/09_Contributing.md @@ -1,6 +1,6 @@ -# Transity Development +## Contributing -## Getting Started +### Getting Started Check out the `makefile` for all available tasks. By simply running `make` it will also print a short list of them. @@ -11,7 +11,7 @@ By simply running `make` it will also print a short list of them. Build and run: ```shell -bun x spago run --exec-args 'balance test/test.yaml' +bunx spago run --exec-args 'balance test/test.yaml' ``` Make `transity` executable available in your path: @@ -24,12 +24,12 @@ All modifications to the source code (after building it) will now be available via the linked `transity` executable. -## Documentation +### Documentation Generate and serve the Pursuit documentation with: ```sh -bun x spago docs +bunx spago docs cd generated-docs/html python3 -m http.server 1222 ``` @@ -47,13 +47,13 @@ markdown-toc -i readme.md [markdown-toc]: https://github.com/jonschlinkert/markdown-toc -## XLSX Generation +### XLSX Generation Check out https://stackoverflow.com/q/18334314/1850340 for an explanation of the XML fields. -## Generate Screenshots +### Generate Screenshots Use [asciinema] to generate the terminal recording: diff --git a/docs_src/10_Presentation.md b/docs_src/10_Presentation.md new file mode 100644 index 0000000..a42982c --- /dev/null +++ b/docs_src/10_Presentation.md @@ -0,0 +1,35 @@ +## Transity + +The Future of Plain Text Accounting + +--- + +### History of Accounting + +`TODO` + +--- + +### Complex Transactions + +`TODO` + +--- + +### High Precision Timestamps + +`TODO` + +--- + +### No Misuse of Accounts as Tags + +Imagine you want to model taxes in your transactions. +The taxes are part of the costs for food, +yet they are not transferred to the food account 🤔. + +--- + +### Example + +`TODO` diff --git a/docs_src/11_License.md b/docs_src/11_License.md new file mode 100644 index 0000000..2ada21d --- /dev/null +++ b/docs_src/11_License.md @@ -0,0 +1,19 @@ +## License + +While Transity is licensed under the [AGPL-3.0-or-later] +and can therefore be used free of charge, +I hope you will acknowledge the work and effort +it takes to maintain and improve this software +and make a donation via my [GitHub Support page]. + +If you find Transity valuable and/or use it regularly this should +be a small nuisance for you, but it would mean a lot to me. +It would mean that I can spend more time on this project +and bring it to the next level! + +Thanks a lot for your support! + +For including Transity in proprietary closed source products, please contact me! + +[AGPL-3.0-or-later]: https://spdx.org/licenses/AGPL-3.0-or-later.html +[GitHub Support page]: https://github.com/sponsors/ad-si diff --git a/docs_src/index.md b/docs_src/index.md new file mode 100644 index 0000000..2ebe138 --- /dev/null +++ b/docs_src/index.md @@ -0,0 +1,16 @@ +# Transity Documentation + +The plain text accounting tool of the future. +Keep track of your 💵, 🕘, 🐖, 🐄, 🍻 on your command line. + +Screenshot Balance + +Also check out the [playground](/) on the landing page! + +For help, please come visit us on our [GitHub Discussions] page! + +[GitHub Discussions]: https://github.com/feramhq/Transity/discussions diff --git a/makefile b/makefile index bc4b8a9..f9d012d 100644 --- a/makefile +++ b/makefile @@ -32,22 +32,25 @@ bundle: index.js # The specified target is configured in package.json -docs: output | node_modules - bun x parcel build webapp/index.html \ - --public-url /Transity \ - --no-source-maps \ - --target $@ +docs/docs: | node_modules + bunx spago run --main Build -# Correct paths for assets during local development -# Use e.g. Vercel's "serve" like this: `serve docs-dev`. -# The specified target is configured in package.json. -docs-dev: output index.js | node_modules - bun x parcel build webapp/index.html \ +# The specified target is configured in package.json +docs: output docs/docs | node_modules + bunx parcel build \ --no-source-maps \ + webapp/index.html \ --target $@ +.PHONY: docs-watch +docs-watch: output | node_modules + bunx parcel watch \ + --no-source-maps \ + webapp/index.html \ + --target docs + output: src spago.yaml | node_modules bun x spago build diff --git a/package.json b/package.json index d7e5648..763860d 100644 --- a/package.json +++ b/package.json @@ -36,29 +36,31 @@ "url": "https://github.com/feramhq/transity.git" }, "dependencies": { - "@eslint/js": "^9.5.0", - "@swc/helpers": "^0.5.11", + "@eslint/js": "^9.16.0", + "@swc/helpers": "^0.5.15", "@types/eslint__js": "^8.42.3", "archiver": "^7.0.1", "big-integer": "^1.6.52", - "chrono-node": "^2.7.6", + "chrono-node": "^2.7.7", "csvnorm": "^1.1.0", "js-yaml": "^4.1.0" }, "optionalDependencies": { "converter": "0.0.5", - "inquirer": "^9.2.23", + "inquirer": "^12.1.0", "tempy": "^3.1.0" }, "devDependencies": { + "@highlightjs/cdn-assets": "^11.10.0", "assert": "^2.1.0", "conventional-changelog-cli": "^5.0.0", - "esbuild": "^0.21.5", - "eslint": "^9.5.0", + "esbuild": "^0.24.0", + "eslint": "^9.16.0", "eslint-config-javascript": "^3.0.0", "events": "^3.3.0", + "highlight.js": "^11.10.0", "markdown-toc": "^1.2.0", - "parcel": "^2.12.0", + "parcel": "^2.13.2", "process": "^0.11.10", "purescript": "^0.15.15", "purs-tidy": "^0.11.0", diff --git a/presentation.md b/presentation.md deleted file mode 100644 index e55637b..0000000 --- a/presentation.md +++ /dev/null @@ -1,25 +0,0 @@ -# Transity - ---- - -## History of Accounting - ---- - -## Complex Transactions - ---- - -## High Precision Timestamps - ---- - -## No Misuse of Accounts as Tags - -Imagine you want to model taxes in your transactions. -The taxes are part of the costs for food, -yet they are not transferred to the food account 🤔. - ---- - -## Example diff --git a/readme.md b/readme.md index d7d5683..38be798 100644 --- a/readme.md +++ b/readme.md @@ -4,632 +4,14 @@ The plain text accounting tool of the future. Keep track of your 💵, 🕘, 🐖, 🐄, 🍻 on your command line. Screenshot Balance +Check out the official [documentation] for more information. + For help, please come visit us on our [GitHub Discussions] page! +[documentation]: https://transity.ad-si.com/ [GitHub Discussions]: https://github.com/feramhq/Transity/discussions - ---- - - - -- [List of Features / TODOs](#list-of-features--todos) -- [Installation](#installation) -- [License](#license) -- [Usage](#usage) - * [Check Order of Entries](#check-order-of-entries) - * [Retrieving Data from Banks](#retrieving-data-from-banks) - + [Script Usage](#script-usage) -- [Journal File Format](#journal-file-format) -- [Plotting](#plotting) -- [Import from Ledger CLI](#import-from-ledger-cli) -- [FAQ](#faq) - * [Why another plain text accounting tool?](#why-another-plain-text-accounting-tool) - * [Why is it written in PureScript?](#why-is-it-written-in-purescript) - * [Why is it not written in Haskell?](#why-is-it-not-written-in-haskell) -- [Comparison with Hledger](#comparison-with-hledger) - * [Syntax](#syntax) - * [Reporting](#reporting) - * [Missing features](#missing-features) - * [Performance](#performance) -- [Ideas](#ideas) - * [Entry / Value Date](#entry--value-date) - * [Syntax](#syntax-1) -- [Related](#related) - - - - -## Features - -- Easily editable and processable file format based on [YAML] -- Modeled on transactions instead of debiting / crediting accounts - => Support for complex transactions made up of several transfers - - Dedicated payer (from) and payee (to) fields (ledger only supports payee) -- No misuse of accounts as categories / tags - => Direct support for tags -- Clear separation between - - Physical account (e.g. wallet, bank account) - - Entities (e.g. my mum, a company) - - Purpose of transaction (e.g. food, travel) -- No hard-coded asset / liability connotation as it is viewpoint dependent - => Choose viewpoint by setting the owner of the journal -- Initial balances -- High precision timestamps in ISO 8601 format -- Reference external files (e.g. receipts, contracts, bank statements, …) -- Safety checks - - BigInt fractional numbers to eliminate rounding errors - - Verifies exclusive use of predefined entities - - Checks in transactions match with verification balances - - Checks that referenced external files exist - and that all external files are referenced -- Export to other formats for post-processing - - [Gnuplot] (for trends) - - [(H)ledger Format] (for using (H)ledger exclusive features) - - CSV and TSV (for further processing in spreadsheet software) - - XLSX aka Excel (for further processing in spreadsheet software) -- Multi file support - -[YAML]: http://yaml.org -[Gnuplot]: http://www.gnuplot.info -[(H)ledger Format]: http://hledger.org/journal.html - - -## Installation - -Transity is distributed as a JavaScript bundle and can therefore -be installed via [npm](https://npmjs.com): - -```sh -bun install --global transity -``` - - -## License - -While Transity is licensed under the AGPL-3.0-or-later -and can therefore be used free of charge, -I hope you will acknowledge the work and effort -it takes to maintain and improve this software -and make a donation via my [GitHub Support page]. - -If you find Transity valuable and/or use it regularly this should -be a small nuisance for you, but it would mean the world for me! -It would mean that I can spend more time on this project -and bring it to the next level! - -Thanks a lot for your support! - -For including Transity in proprietary closed source products, please contact me! - -[GitHub Support page]: https://github.com/sponsors/ad-si - - -## Usage - -```shell -$ transity balance examples/journal.yaml - anna 1 evil-machine - -49978.02 € - ben -50 $ - -1.432592 BTC - -100 € - evil-corp -1 evil-machine - 50015 € - good-inc -100 € - grocery-shop 11.97 € - john 371.04 € - 50 $ - 1.432592 BTC - :default 219.99 € - giro 50 $ - 1.432592 BTC - 85 € - wallet 66.05 € -``` - -If linked modules aren't exposed in your path you can also run - -```shell -cli/main.js balance examples/journal.yaml -``` - - -List complete usage manual by simply calling `transity` without any arguments. - -```shell -$ transity - -Usage: transity - -Command Description ------------------- ------------------------------------------------------------ -balance Simple balance of all accounts -transactions All transactions and their transfers -transfers All transfers with one transfer per line -entries All individual deposits & withdrawals -entries-by-account All individual deposits & withdrawals grouped by account -gplot Code and data for gnuplot impulse diagram - to visualize transfers of all accounts -gplot-cumul Code and data for cumuluative gnuplot step chart - to visualize balance of all accounts -``` - -Screenshot Transfers - - -### Check Order of Entries - -Check if all entries are in a chronological order - -```sh -ag --nonumbers "^ utc:" journals/main.yaml | tr -d "\'" | sort -c -``` - - -### Retrieving Data from Banks - -Transity includes a few scripts located at [./scripts](./scripts) to -automate a Chrome browser to download data. -It supports downloading CSV files of all -transactions and converting them to journal -files and retrieving the current account balance: - -Currently supported accounts for transactions: - -- [DKB Visa Card](https://dkb.de) -- [DKB Giro Account](https://dkb.de) -- [HypoVereinsbank](https://www.hypovereinsbank.de) -- [MBS](https://mbs.de) - -Currently supported accounts for balances: - -- [AWS](https://aws.amazon.com) -- [DKB](https://dkb.de) -- [Fidor](https://fidor.de) -- [Finvesto](https://finvesto.de) -- [HypoVereinsbank](https://www.hypovereinsbank.de) -- [MBS](https://mbs.de) -- [PayPal](https://paypal.com) -- [Deutsche Post Petty Cash](https://portokasse.deutschepost.de) - -Contributions are very welcome! - - -#### Script Usage - -```sh -node scripts/transactions/hypovereinsbank.js > transactions.yaml -``` - -This will prompt you for your credentials and afterwards automate -a headless Chrome instance to download and convert the data. - - -## Journal File Format - -A minimal journal file is a YAML file with following format: - -```yaml -owner: anna -commodities: - - id: € - name: Euro - alias: - - EUR - note: Currency used in the European Union - utc: '2017-04-02 19:33:53' - -entities: - - id: anna - name: Anna Smith - utc: '2017-04-02 19:33:28' - tags: - - person - accounts: - - id: wallet - name: Wallet - note: Anna's black wallet - utc: '2017-04-02 19:33:28' - tags: - - wallet - - - id: evil-corp - name: Evil Corporation - utc: '2017-04-02 19:33:28' - note: The Evil Corporation in the United States of Evil - tags: - - company - -transactions: - - title: Purchase of evil machine - transfers: - - utc: '2017-02-17' - from: anna - to: evil-corp - amount: 50000 € - - utc: '2017-02-17' - from: evil-corp - to: anna - amount: 1 evil-machine -``` - - -## Plotting - -By default all accounts are plotted. -To limit it to only a subsection use `awk` to filter the output. - -For example all transactions of Euro accounts: - -```bash -transity gplot examples/journal.yaml \ -| awk '/^$/ || /(EOD|^set terminal)/ || /€/' \ -| gnuplot \ -| imgcat -``` - - -Or all account balances of Euro accounts over time: - -```bash -transity gplot-cumul examples/journal.yaml \ -| awk '/^$/ || /(EOD|^set terminal)/ || /€/' \ -| gnuplot \ -| imgcat -``` - -![Screenshot of cumulative account balance plot](./images/screenshot-plot.png) - - -## Import - -### AI Powered - -We built a dedicated OpenAI GPT to convert any financial data -(e.g. CSVs, bank statements, chat history, …) to a Transity journal file. - -Check it out at -[chat.openai.com/g/g-aUph953Vj-transity]( - https://chat.openai.com/g/g-aUph953Vj-transity). - - -### From Ledger CLI - -Execute the included ledger2transity script: - -```shell -./ledger2transity.sh examples/hledger.journal > transactions.csv -``` - -Convert `transactions.csv` to YAML with e.g. [browserling.com/tools/csv-to-yaml] - -[browserling.com/tools/csv-to-yaml]: https://browserling.com/tools/csv-to-yaml - - -**Attention:** - -- Merge adjacent entries as each entry only debits / credits an account. - A transaction always involves 2 accounts (`from` and `to`). - (For expenses basically copy the ledger-account from the second entry - into the `from` field of the first entry) -- `from` and `to` might be reversed for income - (depending on how the `payee` field was used) -- Account names of Ledger-CLI are interpreted as tags - Transity understands accounts as **physical accounts** -- The note is duplicated in the `tags` field. - There is no way to get only the tags in Ledger-CLI 😔 - - -## FAQ - -### Why another plain text accounting tool? - -Existing accounting tools are historically based on the notion of an account. -You add money (debit) and you remove money (credit). -(If this sounds backwards to you, read [this explanation]) - -[this explanation]: - http://simplerestaurantaccounting.com/debit-and-credit-accounting-terminology-is-confusing - -For example you get 50 € from your mum and buy some food for 20 €. - -```txt -Account | Debit | Credit ---------|---------|-------- -Wallet | 50.00 € | -Wallet | | 20.00 € ---------------------------- -``` - -Simple, but also incomplete. -Where did the money come from, where did it go? -This led to double entry bookkeeping. -Whenever you add some money to an account, -you have to remove the same amount from another. - - -```txt -Account | Debit | Credit ---------|---------|-------- -Wallet | 50.00 € | -Mum | | 50.00 € -Wallet | | 20.00 € -Food | 20.00 € | ---------------------------- -``` - -But you *must never forget a posting*, -because otherwise your account won't balance. - -```txt -Account | Debit | Credit ---------|---------|-------- -Wallet | 50.00 € | -Mum | | 50.00 € -Wallet | | 20.00 € ---------------------------- -``` - -Oops, where did the money go? 🤷‍ - -If this looks (and sounds) confusing or too complicated, you're not alone! -It made sense in former times as this layout makes it easier -to add up the amounts by hand, but not in times of computers. - -So how can we simplify it? -It's actually quite easy: -We just have to model it in terms of transactions, and not accounts. - -```txt -Amount | From | To --------|--------|-------- -50 € | Mum | Wallet -20 € | Wallet | Food -------------------------- -``` - -- Simple - No more confusing debit / credit / asset / liability mumbo jumbo -- Intuitive - Just like you would talk about it -- Safe - It's obvious if you forget to fill out a field - -Together with some further changes it yields an -**easier to understand, more robust and more complete** -representation of accounting! - - -### Why is it written in PureScript? - -PureScript leverages strong static typing and can therefore -give more guarantees about the functionality of the code -than weakly typed or untyped languages (like JavaScript). - -You wouldn't want your money to get lost in rounding errors or -be turned to `undefined`, would you? 😉 - - -### Why is it not written in Haskell? - -PureScript can also easily be used in the browser or get deployed -as a cloud function as it simply compiles to JavaScript. -With Haskell you'd have to use another language for a web frontend -or quarrel with experimental stuff like [GHCJS]. - -[GHCJS]: https://github.com/ghcjs/ghcjs - - -## Comparison with Hledger - -(H)ledger's transactions are a (balanced) group of account postings. -Transity's transactions are a group of transfers between two accounts. - - -### Syntax - -Checkout the files [hledger.journal] and [journal.yaml] -for similar transactions modeled in Hledger and in Transity. - -[hledger.journal]: ./examples/hledger.journal -[journal.yaml]: ./examples/journal.yaml - - -There is a lot of ambiguity in the ledger journal format. -Are you able to tell the difference between the 2 options? - - -```ledger -2019-01-17 Bought food - expenses:food $10 - assets:cash - -; vs - -2019-01-17 Bought food - assets:cash - expenses:food $10 -``` - -Also, it lacks some fields for more precise recording -of which parties where involved. - -- What food? -- Where did you buy it? -- When exactly did you buy it? -- Which supermarket? - -```ledger -2019-01-17 Bought food - expenses:food $10 - assets:cash -``` - -### Reporting - -```shell -hledger --file examples/hledger.journal balance -# vs -transity balance examples/journal.yaml -``` - -```shell -hledger --file examples/hledger.journal register -# vs -transity transactions examples/journal.yaml -``` - -```shell -hledger --file examples/hledger.journal register --output-format=csv -# vs -transity entries examples/journal.yaml -``` - - -### Missing features - -- No support for precise timestamps (transactions only have an associated date) -- No first class support for Gnuplot - (Check out [Report Scripts for Ledger CLI with Gnuplot] for some scripts) - -[Report Scripts for Ledger CLI with Gnuplot]: - https://www.sundialdreams.com/report-scripts-for-ledger-cli-with-gnuplot - - -### Performance - -Measured with hyperfine including 3 warmups on an early 2015 MacBook Pro. - -*For a journal file with around 2000 entries:* - -Transity: -```txt -Benchmark #1: transity balance journals/main.yaml - Time (mean ± σ): 1.287 s ± 0.021 s [User: 1.790 s, System: 0.140 s] - Range (min … max): 1.250 s … 1.324 s 10 runs -``` - -Hledger: -```txt -Benchmark #1: hledger -f test.ledger balance - Time (mean ± σ): 409.6 ms ± 6.1 ms [User: 366.6 ms, System: 28.5 ms] - Range (min … max): 398.8 ms … 417.6 ms 10 runs -``` - -Ledger: -```txt -Benchmark #1: ledger -f test.ledger balance - Time (mean ± σ): 76.3 ms ± 9.1 ms [User: 62.7 ms, System: 9.4 ms] - Range (min … max): 65.1 ms … 101.8 ms 28 runs -``` - - -## Ideas - -- Features for duplicates - - Print list of possible duplicates - - Label an entry explicitly as a duplicate to store it in several places -- CSV import -- Dashboard -- Budgets (including progress visualization) -- Cache-files to speed up processing of large data sets -- Generate EPC QR Codes for transfers -- LSP server for journal files -- Export to [Graphviz] (for account / entity relations) -- Export to [JS-Sequence-Diagrams] (sequence of transactions) -- Meta data for all entities (transactions, accounts, entities, …) -- Nanosecond precision for timestamps -- Additional features for crypto currencies -- Commodities - - Treat as scientific units (e.g 1 k€ == 1000 €) - - First class support for any type of commodity (e.g. time and messages) - - Support for time limited commodities (e.g. subscription for a month) - - Define which are allowed / prohibited for each account - - Hard vs Soft vs Fungible vs … -- Differentiation between transfers, transactions & exchanges - - Special syntax for exchanges -- Support for all states of transaction life cycle - 1. Request - Request to exchange a commodity - 1. Offer - Specification of commodity & expected trade item - 1. Acceptance - Affirmation of interest in offered exchange - 1. Fulfillments - 1. Certification - Acknowledgment that exchange was performed - -[Graphviz]: https://graphviz.org -[JS-Sequence-Diagrams]: https://bramp.github.io/js-sequence-diagrams - - -### Entry / Value Date - -There are no separate fields for entry or value dates necessary. -Simply use ISO 8601 [time intervals] to specify the duration of a transfer. - -[time intervals]: https://en.wikipedia.org/wiki/ISO_8601#Time_intervals - -```yaml -transactions: - - id: '123456789' - note: Deposit of savings - transfers: - - utc: 2018-01-04T12:00--05T22:10 - from: john - to: bank - amount: 100 € -``` - - -### Syntax - -This is a first concept of an alternative syntax for the journal file: - -```transity -# Comments after a hash - -2016-04-16 18:50:28 -| 1 year registration of domain "example.org" -+tagOne # Tags are written after a plus -+tagTwo -id: 20135604 # Arbitrary metadata -# Transactions are indentend by 2 spaces - john -> paypal : 9.95 € - paypal -> namecheap : {10 + 0.69} $ - paypal -> icann : 0.18 $ +fee - namecheap -> john : 1 Domain -``` - - -## Related - -For a full list of plain text accounting tools check out -[plaintextaccounting.org](https://plaintextaccounting.org). -Here are some of the links -that are especially relevant for Transity: - - -### Other Plain Text Accounting Tools - -- [Ledger] - The original command line accounting tool (written in C++). -- [Hledger] - Ledger clone with a focus on UX, reliability, - and real-world practicality (written in Haskell). -- [Beancount] - Double-entry accounting from text files (written in Python). -- [Rust Ledger] - Ledger clone that uses YAML as well (written in Rust). - -[Beancount]: https://beancount.github.io -[Hledger]: https://hledger.org -[Ledger]: https://ledger-cli.org -[Rust Ledger]: https://github.com/ebcrowder/rust_ledger - - -### Tutorials - -- [cs007.blog] - Personal finance for engineers. -- [principlesofaccounting.com] - Online tutorial on accounting. - -[cs007.blog]: https://cs007.blog -[principlesofaccounting.com]: https://www.principlesofaccounting.com diff --git a/spago.lock b/spago.lock index 7f1ccb1..978634c 100644 --- a/spago.lock +++ b/spago.lock @@ -1,1611 +1,1987 @@ -workspace: - packages: - transity: - path: ./ - dependencies: - - aff - - ansi - - argonaut-codecs - - argonaut-core - - argonaut-generic - - arrays - - console - - control - - datetime - - debug - - effect - - foldable-traversable - - foreign - - foreign-object - - format - - formatters - - functions - - js-bigints - - lists - - maybe - - newtype - - node-buffer - - node-fs - - node-path - - node-process - - nullable - - ordered-collections - - partial - - prelude - - rationals - - result - - strings - - stringutils - - transformers - - tuples - - unfoldable - - yaml-next - test_dependencies: - - spec - build_plan: - - aff - - ansi - - argonaut-codecs - - argonaut-core - - argonaut-generic - - arraybuffer-types - - arrays - - avar - - bifunctors - - catenable-lists - - console - - const - - contravariant - - control - - datetime - - debug - - distributive - - effect - - either - - enums - - exceptions - - exists - - fixed-points - - foldable-traversable - - foreign - - foreign-object - - fork - - format - - formatters - - free - - functions - - functors - - gen - - identity - - integers - - invariant - - js-bigints - - js-date - - js-timers - - lazy - - lcg - - lists - - maybe - - mmorph - - newtype - - node-buffer - - node-event-emitter - - node-fs - - node-path - - node-process - - node-streams - - nonempty - - now - - nullable - - numbers - - ordered-collections - - orders - - parallel - - parsing - - partial - - pipes - - posix-types - - prelude - - profunctor - - psci-support - - quickcheck - - random - - rationals - - record - - refs - - result - - safe-coerce - - spec - - st - - strings - - stringutils - - tailrec - - test-unit - - transformers - - tuples - - type-equality - - typelevel-prelude - - unfoldable - - unicode - - unsafe-coerce - - yaml-next - package_set: - address: - registry: 47.12.0 - compiler: ">=0.15.14 <0.16.0" - content: - abc-parser: 2.0.1 - ace: 9.1.0 - aff: 7.1.0 - aff-bus: 6.0.0 - aff-coroutines: 9.0.0 - aff-promise: 4.0.0 - aff-retry: 2.0.0 - affjax: 13.0.0 - affjax-node: 1.0.0 - affjax-web: 1.0.0 - ansi: 7.0.0 - applicative-phases: 1.0.0 - argonaut: 9.0.0 - argonaut-aeson-generic: 0.4.1 - argonaut-codecs: 9.1.0 - argonaut-core: 7.0.0 - argonaut-generic: 8.0.0 - argonaut-traversals: 10.0.0 - argparse-basic: 2.0.0 - array-builder: 0.1.2 - array-search: 0.5.6 - arraybuffer: 13.2.0 - arraybuffer-builder: 3.1.0 - arraybuffer-types: 3.0.2 - arrays: 7.3.0 - arrays-extra: 0.4.4 - arrays-zipper: 2.0.1 - ask: 1.0.0 - assert: 6.0.0 - assert-multiple: 0.3.4 - avar: 5.0.0 - b64: 0.0.8 - barbies: 1.0.1 - barlow-lens: 0.9.0 - bifunctors: 6.0.0 - bigints: 7.0.1 - bolson: 0.3.9 - bookhound: 0.1.7 - bower-json: 3.0.0 - call-by-name: 4.0.1 - canvas: 6.0.0 - canvas-action: 9.0.0 - cartesian: 1.0.6 - catenable-lists: 7.0.0 - chameleon: 1.0.0 - chameleon-halogen: 1.0.3 - chameleon-react-basic: 1.1.0 - chameleon-styled: 2.5.0 - chameleon-transformers: 1.0.0 - channel: 1.0.0 - checked-exceptions: 3.1.1 - classless: 0.1.1 - classless-arbitrary: 0.1.1 - classless-decode-json: 0.1.1 - classless-encode-json: 0.1.3 - classnames: 2.0.0 - codec: 6.1.0 - codec-argonaut: 10.0.0 - codec-json: 1.1.0 - colors: 7.0.1 - concur-core: 0.5.0 - concur-react: 0.5.0 - concurrent-queues: 3.0.0 - console: 6.1.0 - const: 6.0.0 - contravariant: 6.0.0 - control: 6.0.0 - convertable-options: 1.0.0 - coroutines: 7.0.0 - css: 6.0.0 - css-frameworks: 1.0.1 - data-mvc: 0.0.2 - datetime: 6.1.0 - datetime-parsing: 0.2.0 - debug: 6.0.2 - decimals: 7.1.0 - default-values: 1.0.1 - deku: 0.9.23 - deno: 0.0.5 - dissect: 1.0.0 - distributive: 6.0.0 - dom-filereader: 7.0.0 - dom-indexed: 12.0.0 - dotenv: 4.0.3 - droplet: 0.6.0 - dts: 1.0.0 - dual-numbers: 1.0.2 - dynamic-buffer: 3.0.1 - echarts-simple: 0.0.1 - effect: 4.0.0 - either: 6.1.0 - elmish: 0.10.0 - elmish-enzyme: 0.1.1 - elmish-hooks: 0.10.0 - elmish-html: 0.8.1 - elmish-testing-library: 0.3.1 - email-validate: 7.0.0 - encoding: 0.0.8 - enums: 6.0.1 - env-names: 0.3.4 - error: 2.0.0 - eta-conversion: 0.3.2 - exceptions: 6.0.0 - exists: 6.0.0 - exitcodes: 4.0.0 - expect-inferred: 3.0.0 - fahrtwind: 2.0.0 - fallback: 0.1.0 - fast-vect: 1.2.0 - fetch: 4.1.0 - fetch-argonaut: 1.0.1 - fetch-core: 5.1.0 - fetch-yoga-json: 1.1.0 - filterable: 5.0.0 - fix-functor: 0.1.0 - fixed-points: 7.0.0 - fixed-precision: 5.0.0 - flame: 1.3.0 - float32: 2.0.0 - fmt: 0.2.1 - foldable-traversable: 6.0.0 - foreign: 7.0.0 - foreign-object: 4.1.0 - foreign-readwrite: 3.4.0 - forgetmenot: 0.1.0 - fork: 6.0.0 - form-urlencoded: 7.0.0 - formatters: 7.0.0 - framer-motion: 1.0.1 - free: 7.1.0 - freeap: 7.0.0 - freer-free: 0.0.1 - freet: 7.0.0 - functions: 6.0.0 - functor1: 3.0.0 - functors: 5.0.0 - fuzzy: 0.4.0 - gen: 4.0.0 - generate-values: 1.0.1 - generic-router: 0.0.1 - geojson: 0.0.5 - geometry-plane: 1.0.3 - grain: 3.0.0 - grain-router: 3.0.0 - grain-virtualized: 3.0.0 - graphs: 8.1.0 - group: 4.1.1 - halogen: 7.0.0 - halogen-bootstrap5: 2.3.1 - halogen-css: 10.0.0 - halogen-echarts-simple: 0.0.4 - halogen-formless: 4.0.3 - halogen-helix: 1.0.0 - halogen-hooks: 0.6.3 - halogen-hooks-extra: 0.9.0 - halogen-store: 0.5.4 - halogen-storybook: 2.0.0 - halogen-subscriptions: 2.0.0 - halogen-svg-elems: 8.0.0 - halogen-typewriter: 1.0.4 - halogen-vdom: 8.0.0 - halogen-vdom-string-renderer: 0.5.0 - heckin: 2.0.1 - heterogeneous: 0.6.0 - homogeneous: 0.4.0 - http-methods: 6.0.0 - httpurple: 4.0.0 - humdrum: 0.0.1 - hyrule: 2.3.8 - identity: 6.0.0 - identy: 4.0.1 - indexed-db: 1.0.0 - indexed-monad: 3.0.0 - int64: 3.0.0 - integers: 6.0.0 - interpolate: 5.0.2 - invariant: 6.0.0 - jarilo: 1.0.1 - jelly: 0.10.0 - jelly-router: 0.3.0 - jelly-signal: 0.4.0 - jest: 1.0.0 - js-abort-controller: 1.0.0 - js-bigints: 2.2.1 - js-date: 8.0.0 - js-fetch: 0.2.1 - js-fileio: 3.0.0 - js-intl: 1.0.4 - js-iterators: 0.1.1 - js-maps: 0.1.2 - js-promise: 1.0.0 - js-promise-aff: 1.0.0 - js-timers: 6.1.0 - js-uri: 3.1.0 - json: 1.0.0 - json-codecs: 5.0.0 - justifill: 0.5.0 - jwt: 0.0.9 - labeled-data: 0.2.0 - lazy: 6.0.0 - lazy-joe: 1.0.0 - lcg: 4.0.0 - leibniz: 5.0.0 - liminal: 1.0.1 - linalg: 6.0.0 - lists: 7.0.0 - literals: 1.0.2 - logging: 3.0.0 - logging-journald: 0.4.0 - lumi-components: 18.0.0 - machines: 7.0.0 - maps-eager: 0.4.1 - marionette: 1.0.0 - marionette-react-basic-hooks: 0.1.1 - marked: 0.1.0 - matrices: 5.0.1 - matryoshka: 1.0.0 - maybe: 6.0.0 - media-types: 6.0.0 - meowclient: 1.0.0 - midi: 4.0.0 - milkis: 9.0.0 - minibench: 4.0.1 - mmorph: 7.0.0 - monad-control: 5.0.0 - monad-logger: 1.3.1 - monad-loops: 0.5.0 - monad-unlift: 1.0.1 - monoid-extras: 0.0.1 - monoidal: 0.16.0 - morello: 0.4.0 - mote: 3.0.0 - motsunabe: 2.0.0 - mvc: 0.0.1 - mysql: 6.0.1 - n3: 0.1.0 - nano-id: 1.1.0 - nanoid: 0.1.0 - naturals: 3.0.0 - nested-functor: 0.2.1 - newtype: 5.0.0 - nextjs: 0.1.1 - nextui: 0.2.0 - node-buffer: 9.0.0 - node-child-process: 11.1.0 - node-event-emitter: 3.0.0 - node-execa: 5.0.0 - node-fs: 9.1.0 - node-glob-basic: 1.3.0 - node-http: 9.1.0 - node-http2: 1.1.1 - node-human-signals: 1.0.0 - node-net: 5.1.0 - node-os: 5.1.0 - node-path: 5.0.0 - node-process: 11.2.0 - node-readline: 8.1.0 - node-sqlite3: 8.0.0 - node-streams: 9.0.0 - node-tls: 0.3.1 - node-url: 7.0.1 - node-zlib: 0.4.0 - nonempty: 7.0.0 - now: 6.0.0 - npm-package-json: 2.0.0 - nullable: 6.0.0 - numberfield: 0.1.0 - numbers: 9.0.1 - oak: 3.1.1 - oak-debug: 1.2.2 - object-maps: 0.3.0 - ocarina: 1.5.4 - open-folds: 6.3.0 - open-memoize: 6.1.0 - open-pairing: 6.1.0 - options: 7.0.0 - optparse: 5.0.1 - ordered-collections: 3.1.1 - ordered-set: 0.4.0 - orders: 6.0.0 - owoify: 1.2.0 - pairs: 9.0.1 - parallel: 7.0.0 - parsing: 10.2.0 - parsing-dataview: 3.2.4 - partial: 4.0.0 - pathy: 9.0.0 - pha: 0.13.0 - phaser: 0.7.0 - phylio: 1.1.2 - pipes: 8.0.0 - pirates-charm: 0.0.1 - pmock: 0.9.0 - point-free: 1.0.0 - pointed-list: 0.5.1 - polymorphic-vectors: 4.0.0 - posix-types: 6.0.0 - precise: 6.0.0 - precise-datetime: 7.0.0 - prelude: 6.0.1 - prettier-printer: 3.0.0 - profunctor: 6.0.0 - profunctor-lenses: 8.0.0 - protobuf: 4.3.0 - psa-utils: 8.0.0 - psci-support: 6.0.0 - qualified-do: 2.2.0 - quantities: 12.2.0 - quickcheck: 8.0.1 - quickcheck-combinators: 0.1.3 - quickcheck-laws: 7.0.0 - quickcheck-utf8: 0.0.0 - random: 6.0.0 - rationals: 6.0.0 - rdf: 0.1.0 - react: 11.0.0 - react-aria: 0.2.0 - react-basic: 17.0.0 - react-basic-classic: 3.0.0 - react-basic-dnd: 10.1.0 - react-basic-dom: 6.1.0 - react-basic-emotion: 7.1.0 - react-basic-hooks: 8.2.0 - react-basic-storybook: 2.0.0 - react-dom: 8.0.0 - react-halo: 3.0.0 - react-icons: 1.1.4 - react-markdown: 0.1.0 - react-testing-library: 4.0.1 - react-virtuoso: 1.0.0 - read: 1.0.1 - recharts: 1.1.0 - record: 4.0.0 - record-extra: 5.0.1 - record-ptional-fields: 0.1.2 - record-studio: 1.0.4 - refs: 6.0.0 - remotedata: 5.0.0 - resource: 2.0.1 - resourcet: 1.0.0 - result: 1.0.3 - return: 0.2.0 - ring-modules: 5.0.1 - rito: 0.3.4 - routing: 11.0.0 - routing-duplex: 0.7.0 - run: 5.0.0 - safe-coerce: 2.0.0 - safely: 4.0.1 - school-of-music: 1.3.0 - selection-foldable: 0.2.0 - selective-functors: 1.0.1 - semirings: 7.0.0 - signal: 13.0.0 - simple-emitter: 3.0.1 - simple-i18n: 2.0.1 - simple-json: 9.0.0 - simple-ulid: 3.0.0 - sized-matrices: 1.0.0 - sized-vectors: 5.0.2 - slug: 3.0.8 - small-ffi: 4.0.1 - soundfonts: 4.1.0 - sparse-matrices: 1.3.0 - sparse-polynomials: 2.0.5 - spec: 7.5.5 - spec-mocha: 5.1.0 - spec-quickcheck: 5.0.0 - splitmix: 2.1.0 - ssrs: 1.0.0 - st: 6.2.0 - statistics: 0.3.2 - strictlypositiveint: 1.0.1 - string-parsers: 8.0.0 - strings: 6.0.1 - strings-extra: 4.0.0 - stringutils: 0.0.12 - substitute: 0.2.3 - supply: 0.2.0 - svg-parser: 3.0.0 - systemd-journald: 0.3.0 - tagged: 4.0.2 - tailrec: 6.1.0 - tecton: 0.2.1 - tecton-halogen: 0.2.0 - test-unit: 17.0.0 - thermite: 6.3.1 - thermite-dom: 0.3.1 - these: 6.0.0 - transformation-matrix: 1.0.1 - transformers: 6.0.0 - tree-rose: 4.0.2 - ts-bridge: 4.0.0 - tuples: 7.0.0 - two-or-more: 1.0.0 - type-equality: 4.0.1 - typedenv: 2.0.1 - typelevel: 6.0.0 - typelevel-lists: 2.1.0 - typelevel-peano: 1.0.1 - typelevel-prelude: 7.0.0 - typelevel-regex: 0.0.3 - typelevel-rows: 0.1.0 - uint: 7.0.0 - ulid: 3.0.1 - uncurried-transformers: 1.1.0 - undefined: 2.0.0 - undefined-is-not-a-problem: 1.1.0 - unfoldable: 6.0.0 - unicode: 6.0.0 - unique: 0.6.1 - unlift: 1.0.1 - unordered-collections: 3.0.1 - unsafe-coerce: 6.0.0 - unsafe-reference: 5.0.0 - untagged-to-tagged: 0.1.4 - untagged-union: 1.0.0 - uri: 9.0.0 - uuid: 9.0.0 - uuidv4: 1.0.0 - validation: 6.0.0 - variant: 8.0.0 - variant-encodings: 2.0.0 - vectorfield: 1.0.1 - vectors: 2.1.0 - versions: 7.0.0 - visx: 0.0.2 - web-clipboard: 5.0.0 - web-cssom: 2.0.0 - web-cssom-view: 0.1.0 - web-dom: 6.0.0 - web-dom-parser: 8.0.0 - web-dom-xpath: 3.0.0 - web-encoding: 3.0.0 - web-events: 4.0.0 - web-fetch: 4.0.1 - web-file: 4.0.0 - web-geometry: 0.1.0 - web-html: 4.1.0 - web-pointerevents: 2.0.0 - web-proletarian: 1.0.0 - web-promise: 3.2.0 - web-resize-observer: 2.1.0 - web-router: 1.0.0 - web-socket: 4.0.0 - web-storage: 5.0.0 - web-streams: 4.0.0 - web-touchevents: 4.0.0 - web-uievents: 5.0.0 - web-url: 2.0.0 - web-workers: 1.1.0 - web-xhr: 5.0.1 - webextension-polyfill: 0.1.0 - webgpu: 0.0.1 - which: 2.0.0 - yoga-fetch: 1.0.1 - yoga-json: 5.1.0 - yoga-om: 0.1.0 - yoga-postgres: 6.0.0 - yoga-tree: 1.0.0 - z3: 0.0.2 - zipperarray: 2.0.0 - extra_packages: - format: - git: https://github.com/feramhq/purescript-format - ref: 3b0fc6c74f439fc3ad7fc7c88fc6f73b083f82e2 - dependencies: - - control - - effect - - integers - - maybe - - numbers - - prelude - - strings - - test-unit - - unfoldable - yaml-next: - git: https://github.com/archaeron/purescript-yaml-next - ref: cd4833a32458e06ebb4338c3e00f98723c681891 - dependencies: - - argonaut-codecs - - argonaut-core - - console - - effect - - foreign - - functions - - ordered-collections - - psci-support - - spec - - unsafe-coerce -packages: - aff: - type: registry - version: 7.1.0 - integrity: sha256-7hOC6uQO9XBAI5FD8F33ChLjFAiZVfd4BJMqlMh7TNU= - dependencies: - - arrays - - bifunctors - - control - - datetime - - effect - - either - - exceptions - - foldable-traversable - - functions - - maybe - - newtype - - parallel - - prelude - - refs - - tailrec - - transformers - - unsafe-coerce - ansi: - type: registry - version: 7.0.0 - integrity: sha256-ZMB6HD+q9CXvn9fRCmJ8dvuDrOVHcjombL3oNOerVnE= - dependencies: - - foldable-traversable - - lists - - strings - argonaut-codecs: - type: registry - version: 9.1.0 - integrity: sha256-N6efXByUeg848ompEqJfVvZuZPfdRYDGlTDFn0G0Oh8= - dependencies: - - argonaut-core - - arrays - - effect - - foreign-object - - identity - - integers - - maybe - - nonempty - - ordered-collections - - prelude - - record - argonaut-core: - type: registry - version: 7.0.0 - integrity: sha256-RC82GfAjItydxrO24cdX373KHVZiLqybu19b5X8u7B4= - dependencies: - - arrays - - control - - either - - foreign-object - - functions - - gen - - maybe - - nonempty - - prelude - - strings - - tailrec - argonaut-generic: - type: registry - version: 8.0.0 - integrity: sha256-WCqRWoomRKg5BFZnGBS4k4SqBX84fy/X1aJzMyaIeP0= - dependencies: - - argonaut-codecs - - argonaut-core - - prelude - - record - arraybuffer-types: - type: registry - version: 3.0.2 - integrity: sha256-mQKokysYVkooS4uXbO+yovmV/s8b138Ws3zQvOwIHRA= - dependencies: [] - arrays: - type: registry - version: 7.3.0 - integrity: sha256-tmcklBlc/muUtUfr9RapdCPwnlQeB3aSrC4dK85gQlc= - dependencies: - - bifunctors - - control - - foldable-traversable - - functions - - maybe - - nonempty - - partial - - prelude - - safe-coerce - - st - - tailrec - - tuples - - unfoldable - - unsafe-coerce - avar: - type: registry - version: 5.0.0 - integrity: sha256-e7hf0x4hEpcygXP0LtvfvAQ49Bbj2aWtZT3gqM///0A= - dependencies: - - aff - - effect - - either - - exceptions - - functions - - maybe - bifunctors: - type: registry - version: 6.0.0 - integrity: sha256-/gZwC9YhNxZNQpnHa5BIYerCGM2jeX9ukZiEvYxm5Nw= - dependencies: - - const - - either - - newtype - - prelude - - tuples - catenable-lists: - type: registry - version: 7.0.0 - integrity: sha256-76vYENhwF4BWTBsjeLuErCH2jqVT4M3R1HX+4RwSftA= - dependencies: - - control - - foldable-traversable - - lists - - maybe - - prelude - - tuples - - unfoldable - console: - type: registry - version: 6.1.0 - integrity: sha256-CxmAzjgyuGDmt9FZW51VhV6rBPwR6o0YeKUzA9rSzcM= - dependencies: - - effect - - prelude - const: - type: registry - version: 6.0.0 - integrity: sha256-tNrxDW8D8H4jdHE2HiPzpLy08zkzJMmGHdRqt5BQuTc= - dependencies: - - invariant - - newtype - - prelude - contravariant: - type: registry - version: 6.0.0 - integrity: sha256-TP+ooAp3vvmdjfQsQJSichF5B4BPDHp3wAJoWchip6c= - dependencies: - - const - - either - - newtype - - prelude - - tuples - control: - type: registry - version: 6.0.0 - integrity: sha256-sH7Pg9E96JCPF9PIA6oQ8+BjTyO/BH1ZuE/bOcyj4Jk= - dependencies: - - newtype - - prelude - datetime: - type: registry - version: 6.1.0 - integrity: sha256-g/5X5BBegQWLpI9IWD+sY6mcaYpzzlW5lz5NBzaMtyI= - dependencies: - - bifunctors - - control - - either - - enums - - foldable-traversable - - functions - - gen - - integers - - lists - - maybe - - newtype - - numbers - - ordered-collections - - partial - - prelude - - tuples - debug: - type: registry - version: 6.0.2 - integrity: sha256-vmkYFuXYuELBzeauvgHG6E6Kf/Hp1dAnxwE9ByHfwSg= - dependencies: - - functions - - prelude - distributive: - type: registry - version: 6.0.0 - integrity: sha256-HTDdmEnzigMl+02SJB88j+gAXDx9VKsbvR4MJGDPbOQ= - dependencies: - - identity - - newtype - - prelude - - tuples - - type-equality - effect: - type: registry - version: 4.0.0 - integrity: sha256-eBtZu+HZcMa5HilvI6kaDyVX3ji8p0W9MGKy2K4T6+M= - dependencies: - - prelude - either: - type: registry - version: 6.1.0 - integrity: sha256-6hgTPisnMWVwQivOu2PKYcH8uqjEOOqDyaDQVUchTpY= - dependencies: - - control - - invariant - - maybe - - prelude - enums: - type: registry - version: 6.0.1 - integrity: sha256-HWaD73JFLorc4A6trKIRUeDMdzE+GpkJaEOM1nTNkC8= - dependencies: - - control - - either - - gen - - maybe - - newtype - - nonempty - - partial - - prelude - - tuples - - unfoldable - exceptions: - type: registry - version: 6.0.0 - integrity: sha256-y/xTAEIZIARCE+50/u1di0ncebJ+CIwNOLswyOWzMTw= - dependencies: - - effect - - either - - maybe - - prelude - exists: - type: registry - version: 6.0.0 - integrity: sha256-A0JQHpTfo1dNOj9U5/Fd3xndlRSE0g2IQWOGor2yXn8= - dependencies: - - unsafe-coerce - fixed-points: - type: registry - version: 7.0.0 - integrity: sha256-hTl5fzeG4mzAOFzEzAeNH7kJvJgYCH7x3v2NdX9pOE4= - dependencies: - - exists - - newtype - - prelude - - transformers - foldable-traversable: - type: registry - version: 6.0.0 - integrity: sha256-fLeqRYM4jUrZD5H4WqcwUgzU7XfYkzO4zhgtNc3jcWM= - dependencies: - - bifunctors - - const - - control - - either - - functors - - identity - - maybe - - newtype - - orders - - prelude - - tuples - foreign: - type: registry - version: 7.0.0 - integrity: sha256-1ORiqoS3HW+qfwSZAppHPWy4/6AQysxZ2t29jcdUMNA= - dependencies: - - either - - functions - - identity - - integers - - lists - - maybe - - prelude - - strings - - transformers - foreign-object: - type: registry - version: 4.1.0 - integrity: sha256-q24okj6mT+yGHYQ+ei/pYPj5ih6sTbu7eDv/WU56JVo= - dependencies: - - arrays - - foldable-traversable - - functions - - gen - - lists - - maybe - - prelude - - st - - tailrec - - tuples - - typelevel-prelude - - unfoldable - fork: - type: registry - version: 6.0.0 - integrity: sha256-X7u0SuCvFbLbzuNEKLBNuWjmcroqMqit4xEzpQwAP7E= - dependencies: - - aff - format: - type: git - url: https://github.com/feramhq/purescript-format - rev: 3b0fc6c74f439fc3ad7fc7c88fc6f73b083f82e2 - dependencies: - - control - - effect - - integers - - maybe - - numbers - - prelude - - strings - - test-unit - - unfoldable - formatters: - type: registry - version: 7.0.0 - integrity: sha256-5JaC9d2p0xoqJWjWxlHH19R4iJwFTBr4j7SlYcLgicE= - dependencies: - - datetime - - fixed-points - - lists - - numbers - - parsing - - prelude - - transformers - free: - type: registry - version: 7.1.0 - integrity: sha256-JAumgEsGSzJCNLD8AaFvuX7CpqS5yruCngi6yI7+V5k= - dependencies: - - catenable-lists - - control - - distributive - - either - - exists - - foldable-traversable - - invariant - - lazy - - maybe - - prelude - - tailrec - - transformers - - tuples - - unsafe-coerce - functions: - type: registry - version: 6.0.0 - integrity: sha256-adMyJNEnhGde2unHHAP79gPtlNjNqzgLB8arEOn9hLI= - dependencies: - - prelude - functors: - type: registry - version: 5.0.0 - integrity: sha256-zfPWWYisbD84MqwpJSZFlvM6v86McM68ob8p9s27ywU= - dependencies: - - bifunctors - - const - - contravariant - - control - - distributive - - either - - invariant - - maybe - - newtype - - prelude - - profunctor - - tuples - - unsafe-coerce - gen: - type: registry - version: 4.0.0 - integrity: sha256-f7yzAXWwr+xnaqEOcvyO3ezKdoes8+WXWdXIHDBCAPI= - dependencies: - - either - - foldable-traversable - - identity - - maybe - - newtype - - nonempty - - prelude - - tailrec - - tuples - - unfoldable - identity: - type: registry - version: 6.0.0 - integrity: sha256-4wY0XZbAksjY6UAg99WkuKyJlQlWAfTi2ssadH0wVMY= - dependencies: - - control - - invariant - - newtype - - prelude - integers: - type: registry - version: 6.0.0 - integrity: sha256-sf+sK26R1hzwl3NhXR7WAu9zCDjQnfoXwcyGoseX158= - dependencies: - - maybe - - numbers - - prelude - invariant: - type: registry - version: 6.0.0 - integrity: sha256-RGWWyYrz0Hs1KjPDA+87Kia67ZFBhfJ5lMGOMCEFoLo= - dependencies: - - control - - prelude - js-bigints: - type: registry - version: 2.2.1 - integrity: sha256-hKWZo9NxtsAaHmNXr6B8GY4c0olQbYLXPVGWm4TF2Ss= - dependencies: - - integers - - maybe - - prelude - js-date: - type: registry - version: 8.0.0 - integrity: sha256-6TVF4DWg5JL+jRAsoMssYw8rgOVALMUHT1CuNZt8NRo= - dependencies: - - datetime - - effect - - exceptions - - foreign - - integers - - now - js-timers: - type: registry - version: 6.1.0 - integrity: sha256-znHWLSSOYw15P5DTcsAdal2lf7nGA2yayLdOZ2t5r7o= - dependencies: - - effect - lazy: - type: registry - version: 6.0.0 - integrity: sha256-lMsfFOnlqfe4KzRRiW8ot5ge6HtcU3Eyh2XkXcP5IgU= - dependencies: - - control - - foldable-traversable - - invariant - - prelude - lcg: - type: registry - version: 4.0.0 - integrity: sha256-h7ME5cthLfbgJOJdsZcSfFpwXsx4rf8YmhebU+3iSYg= - dependencies: - - effect - - integers - - maybe - - partial - - prelude - - random - lists: - type: registry - version: 7.0.0 - integrity: sha256-EKF15qYqucuXP2lT/xPxhqy58f0FFT6KHdIB/yBOayI= - dependencies: - - bifunctors - - control - - foldable-traversable - - lazy - - maybe - - newtype - - nonempty - - partial - - prelude - - tailrec - - tuples - - unfoldable - maybe: - type: registry - version: 6.0.0 - integrity: sha256-5cCIb0wPwbat2PRkQhUeZO0jcAmf8jCt2qE0wbC3v2Q= - dependencies: - - control - - invariant - - newtype - - prelude - mmorph: - type: registry - version: 7.0.0 - integrity: sha256-urZlZNNqGeQFe5D/ClHlR8QgGBNHTMFPtJ5S5IpflTQ= - dependencies: - - free - - functors - - transformers - newtype: - type: registry - version: 5.0.0 - integrity: sha256-gdrQu8oGe9eZE6L3wOI8ql/igOg+zEGB5ITh2g+uttw= - dependencies: - - prelude - - safe-coerce - node-buffer: - type: registry - version: 9.0.0 - integrity: sha256-PWE2DJ5ruBLCmeA/fUiuySEFmUJ/VuRfyrnCuVZBlu4= - dependencies: - - arraybuffer-types - - effect - - maybe - - nullable - - st - - unsafe-coerce - node-event-emitter: - type: registry - version: 3.0.0 - integrity: sha256-Qw0MjsT4xRH2j2i4K8JmRjcMKnH5z1Cw39t00q4LE4w= - dependencies: - - effect - - either - - functions - - maybe - - nullable - - prelude - - unsafe-coerce - node-fs: - type: registry - version: 9.1.0 - integrity: sha256-TzhvGdrwcM0bazDvrWSqh+M/H8GKYf1Na6aGm2Qg4+c= - dependencies: - - datetime - - effect - - either - - enums - - exceptions - - functions - - integers - - js-date - - maybe - - node-buffer - - node-path - - node-streams - - nullable - - partial - - prelude - - strings - - unsafe-coerce - node-path: - type: registry - version: 5.0.0 - integrity: sha256-pd82nQ+2l5UThzaxPdKttgDt7xlsgIDLpPG0yxDEdyE= - dependencies: - - effect - node-process: - type: registry - version: 11.2.0 - integrity: sha256-+2MQDYChjGbVbapCyJtuWYwD41jk+BntF/kcOTKBMVs= - dependencies: - - effect - - foreign - - foreign-object - - maybe - - node-event-emitter - - node-streams - - posix-types - - prelude - - unsafe-coerce - node-streams: - type: registry - version: 9.0.0 - integrity: sha256-2n6dq7YWleTDmD1Kur/ul7Cn08IvWrScgPf+0PgX2TQ= - dependencies: - - aff - - effect - - either - - exceptions - - node-buffer - - node-event-emitter - - nullable - - prelude - nonempty: - type: registry - version: 7.0.0 - integrity: sha256-54ablJZUHGvvlTJzi3oXyPCuvY6zsrWJuH/dMJ/MFLs= - dependencies: - - control - - foldable-traversable - - maybe - - prelude - - tuples - - unfoldable - now: - type: registry - version: 6.0.0 - integrity: sha256-xZ7x37ZMREfs6GCDw/h+FaKHV/3sPWmtqBZRGTxybQY= - dependencies: - - datetime - - effect - nullable: - type: registry - version: 6.0.0 - integrity: sha256-yiGBVl3AD+Guy4kNWWeN+zl1gCiJK+oeIFtZtPCw4+o= - dependencies: - - effect - - functions - - maybe - numbers: - type: registry - version: 9.0.1 - integrity: sha256-/9M6aeMDBdB4cwYDeJvLFprAHZ49EbtKQLIJsneXLIk= - dependencies: - - functions - - maybe - ordered-collections: - type: registry - version: 3.1.1 - integrity: sha256-boSYHmlz4aSbwsNN4VxiwCStc0t+y1F7BXmBS+1JNtI= - dependencies: - - arrays - - foldable-traversable - - gen - - lists - - maybe - - partial - - prelude - - st - - tailrec - - tuples - - unfoldable - orders: - type: registry - version: 6.0.0 - integrity: sha256-nBA0g3/ai0euH8q9pSbGqk53W2q6agm/dECZTHcoink= - dependencies: - - newtype - - prelude - parallel: - type: registry - version: 7.0.0 - integrity: sha256-gUC9i4Txnx9K9RcMLsjujbwZz6BB1bnE2MLvw4GIw5o= - dependencies: - - control - - effect - - either - - foldable-traversable - - functors - - maybe - - newtype - - prelude - - profunctor - - refs - - transformers - parsing: - type: registry - version: 10.2.0 - integrity: sha256-ZDIdMFAKkst57x6BVa1aUWJnS8smoZnXsZ339Aq1mPA= - dependencies: - - arrays - - control - - effect - - either - - enums - - foldable-traversable - - functions - - identity - - integers - - lazy - - lists - - maybe - - newtype - - nullable - - numbers - - partial - - prelude - - st - - strings - - tailrec - - transformers - - tuples - - unfoldable - - unicode - - unsafe-coerce - partial: - type: registry - version: 4.0.0 - integrity: sha256-fwXerld6Xw1VkReh8yeQsdtLVrjfGiVuC5bA1Wyo/J4= - dependencies: [] - pipes: - type: registry - version: 8.0.0 - integrity: sha256-kvfqGM4cPA/wCcBHbp5psouFw5dZGvku2462x7ZBwSY= - dependencies: - - aff - - lists - - mmorph - - prelude - - tailrec - - transformers - - tuples - posix-types: - type: registry - version: 6.0.0 - integrity: sha256-ZfFz8RR1lee/o/Prccyeut3Q+9tYd08mlR72sIh6GzA= - dependencies: - - maybe - - prelude - prelude: - type: registry - version: 6.0.1 - integrity: sha256-o8p6SLYmVPqzXZhQFd2hGAWEwBoXl1swxLG/scpJ0V0= - dependencies: [] - profunctor: - type: registry - version: 6.0.0 - integrity: sha256-99NzxFgTr4CGlCSRYG1kShL+JhYbihhHtbOk1/0R5zI= - dependencies: - - control - - distributive - - either - - exists - - invariant - - newtype - - prelude - - tuples - psci-support: - type: registry - version: 6.0.0 - integrity: sha256-C6ql4P9TEP06hft/1Z5QumPA4yARR4VIxDdhmL1EO+Y= - dependencies: - - console - - effect - - prelude - quickcheck: - type: registry - version: 8.0.1 - integrity: sha256-ZvpccKQCvgslTXZCNmpYW4bUsFzhZd/kQUr2WmxFTGY= - dependencies: - - arrays - - console - - control - - effect - - either - - enums - - exceptions - - foldable-traversable - - gen - - identity - - integers - - lazy - - lcg - - lists - - maybe - - newtype - - nonempty - - numbers - - partial - - prelude - - record - - st - - strings - - tailrec - - transformers - - tuples - - unfoldable - random: - type: registry - version: 6.0.0 - integrity: sha256-CJ611a35MPCE7XQMp0rdC6MCn76znlhisiCRgboAG+Q= - dependencies: - - effect - - integers - rationals: - type: registry - version: 6.0.0 - integrity: sha256-58lUkv9LTanrMJ9U/IYf+i4+NibDZb6suVfLOK4OKhA= - dependencies: - - integers - - js-bigints - - prelude - record: - type: registry - version: 4.0.0 - integrity: sha256-Za5U85bTRJEfGK5Sk4hM41oXy84YQI0I8TL3WUn1Qzg= - dependencies: - - functions - - prelude - - unsafe-coerce - refs: - type: registry - version: 6.0.0 - integrity: sha256-Vgwne7jIbD3ZMoLNNETLT8Litw6lIYo3MfYNdtYWj9s= - dependencies: - - effect - - prelude - result: - type: registry - version: 1.0.3 - integrity: sha256-z83tw/z/S2Kt7g1YSMk0qXHa0pi/K3qEYm0uiYWcH48= - dependencies: - - either - - foldable-traversable - - prelude - safe-coerce: - type: registry - version: 2.0.0 - integrity: sha256-a1ibQkiUcbODbLE/WAq7Ttbbh9ex+x33VCQ7GngKudU= - dependencies: - - unsafe-coerce - spec: - type: registry - version: 7.5.5 - integrity: sha256-HdyBH7Ys1/m2SdTq3u2u9LdQ4cGeaohWeEMYay2mHdU= - dependencies: - - aff - - ansi - - arrays - - avar - - bifunctors - - control - - datetime - - debug - - effect - - either - - exceptions - - foldable-traversable - - fork - - identity - - integers - - lists - - maybe - - newtype - - now - - ordered-collections - - parallel - - pipes - - prelude - - refs - - strings - - tailrec - - transformers - - tuples - st: - type: registry - version: 6.2.0 - integrity: sha256-z9X0WsOUlPwNx9GlCC+YccCyz8MejC8Wb0C4+9fiBRY= - dependencies: - - partial - - prelude - - tailrec - - unsafe-coerce - strings: - type: registry - version: 6.0.1 - integrity: sha256-WssD3DbX4OPzxSdjvRMX0yvc9+pS7n5gyPv5I2Trb7k= - dependencies: - - arrays - - control - - either - - enums - - foldable-traversable - - gen - - integers - - maybe - - newtype - - nonempty - - partial - - prelude - - tailrec - - tuples - - unfoldable - - unsafe-coerce - stringutils: - type: registry - version: 0.0.12 - integrity: sha256-t63QWBlp49U0nRqUcFryKflSJsNKGTQAHKjn24/+ooI= - dependencies: - - arrays - - integers - - maybe - - partial - - prelude - - strings - tailrec: - type: registry - version: 6.1.0 - integrity: sha256-Xx19ECVDRrDWpz9D2GxQHHV89vd61dnXxQm0IcYQHGk= - dependencies: - - bifunctors - - effect - - either - - identity - - maybe - - partial - - prelude - - refs - test-unit: - type: registry - version: 17.0.0 - integrity: sha256-aITJ2KngFFjASmG0JjnjybaKWl9dn7Hf2B3Wk4engNs= - dependencies: - - aff - - avar - - effect - - either - - free - - js-timers - - lists - - prelude - - quickcheck - - strings - transformers: - type: registry - version: 6.0.0 - integrity: sha256-Pzw40HjthX77tdPAYzjx43LK3X5Bb7ZspYAp27wksFA= - dependencies: - - control - - distributive - - effect - - either - - exceptions - - foldable-traversable - - identity - - lazy - - maybe - - newtype - - prelude - - tailrec - - tuples - - unfoldable - tuples: - type: registry - version: 7.0.0 - integrity: sha256-1rXgTomes9105BjgXqIw0FL6Fz1lqqUTLWOumhWec1M= - dependencies: - - control - - invariant - - prelude - type-equality: - type: registry - version: 4.0.1 - integrity: sha256-Hs9D6Y71zFi/b+qu5NSbuadUQXe5iv5iWx0226vOHUw= - dependencies: [] - typelevel-prelude: - type: registry - version: 7.0.0 - integrity: sha256-uFF2ph+vHcQpfPuPf2a3ukJDFmLhApmkpTMviHIWgJM= - dependencies: - - prelude - - type-equality - unfoldable: - type: registry - version: 6.0.0 - integrity: sha256-JtikvJdktRap7vr/K4ITlxUX1QexpnqBq0G/InLr6eg= - dependencies: - - foldable-traversable - - maybe - - partial - - prelude - - tuples - unicode: - type: registry - version: 6.0.0 - integrity: sha256-QJnTVZpmihEAUiMeYrfkusVoziJWp2hJsgi9bMQLue8= - dependencies: - - foldable-traversable - - maybe - - strings - unsafe-coerce: - type: registry - version: 6.0.0 - integrity: sha256-IqIYW4Vkevn8sI+6aUwRGvd87tVL36BBeOr0cGAE7t0= - dependencies: [] - yaml-next: - type: git - url: https://github.com/archaeron/purescript-yaml-next - rev: cd4833a32458e06ebb4338c3e00f98723c681891 - dependencies: - - argonaut-codecs - - argonaut-core - - console - - effect - - foreign - - functions - - ordered-collections - - psci-support - - spec - - unsafe-coerce +{ + "workspace": { + "packages": { + "transity": { + "path": "./", + "core": { + "dependencies": [ + "aff", + "ansi", + "argonaut-codecs", + "argonaut-core", + "argonaut-generic", + "arrays", + "console", + "control", + "datetime", + "debug", + "effect", + "foldable-traversable", + "foreign", + "foreign-object", + "format", + "formatters", + "functions", + "js-bigints", + "lists", + "markdown-it", + "maybe", + "newtype", + "node-buffer", + "node-fs", + "node-fs-extra", + "node-path", + "node-process", + "nullable", + "ordered-collections", + "partial", + "prelude", + "rationals", + "result", + "strings", + "stringutils", + "transformers", + "tuples", + "unfoldable", + "yaml-next" + ], + "build_plan": [ + "aff", + "aff-promise", + "ansi", + "argonaut-codecs", + "argonaut-core", + "argonaut-generic", + "arraybuffer-types", + "arrays", + "avar", + "bifunctors", + "catenable-lists", + "console", + "const", + "contravariant", + "control", + "datetime", + "debug", + "distributive", + "effect", + "either", + "enums", + "exceptions", + "exists", + "fixed-points", + "foldable-traversable", + "foreign", + "foreign-object", + "fork", + "format", + "formatters", + "free", + "functions", + "functors", + "gen", + "identity", + "integers", + "invariant", + "jest", + "js-bigints", + "js-date", + "js-timers", + "lazy", + "lcg", + "lists", + "markdown-it", + "maybe", + "mmorph", + "newtype", + "node-buffer", + "node-event-emitter", + "node-fs", + "node-fs-extra", + "node-path", + "node-process", + "node-streams", + "nonempty", + "now", + "nullable", + "numbers", + "options", + "ordered-collections", + "orders", + "parallel", + "parsing", + "partial", + "pipes", + "posix-types", + "prelude", + "profunctor", + "psci-support", + "quickcheck", + "random", + "rationals", + "record", + "refs", + "result", + "safe-coerce", + "spec", + "st", + "strings", + "stringutils", + "tailrec", + "test-unit", + "transformers", + "tuples", + "type-equality", + "typelevel-prelude", + "unfoldable", + "unicode", + "unsafe-coerce", + "yaml-next" + ] + }, + "test": { + "dependencies": [ + "spec" + ], + "build_plan": [ + "aff", + "ansi", + "arrays", + "avar", + "bifunctors", + "catenable-lists", + "const", + "contravariant", + "control", + "datetime", + "distributive", + "effect", + "either", + "enums", + "exceptions", + "exists", + "foldable-traversable", + "fork", + "free", + "functions", + "functors", + "gen", + "identity", + "integers", + "invariant", + "lazy", + "lists", + "maybe", + "mmorph", + "newtype", + "nonempty", + "now", + "numbers", + "ordered-collections", + "orders", + "parallel", + "partial", + "pipes", + "prelude", + "profunctor", + "refs", + "safe-coerce", + "spec", + "st", + "strings", + "tailrec", + "transformers", + "tuples", + "type-equality", + "unfoldable", + "unsafe-coerce" + ] + } + } + }, + "package_set": { + "address": { + "registry": "61.2.0" + }, + "compiler": ">=0.15.15 <0.16.0", + "content": { + "abc-parser": "2.0.1", + "ace": "9.1.0", + "address-rfc2821": "0.1.1", + "aff": "8.0.0", + "aff-bus": "6.0.0", + "aff-coroutines": "9.0.0", + "aff-promise": "4.0.0", + "aff-retry": "2.0.0", + "affjax": "13.0.0", + "affjax-node": "1.0.0", + "affjax-web": "1.0.0", + "ansi": "7.0.0", + "apexcharts": "0.5.0", + "applicative-phases": "1.0.0", + "argonaut": "9.0.0", + "argonaut-aeson-generic": "0.4.1", + "argonaut-codecs": "9.1.0", + "argonaut-core": "7.0.0", + "argonaut-generic": "8.0.0", + "argonaut-traversals": "10.0.0", + "argparse-basic": "2.0.0", + "array-builder": "0.1.2", + "array-search": "0.6.0", + "arraybuffer": "13.2.0", + "arraybuffer-builder": "3.1.0", + "arraybuffer-types": "3.0.2", + "arrays": "7.3.0", + "arrays-extra": "0.6.1", + "arrays-zipper": "2.0.1", + "ask": "1.0.0", + "assert": "6.0.0", + "assert-multiple": "0.4.0", + "avar": "5.0.0", + "b64": "0.0.8", + "barbies": "1.0.1", + "barlow-lens": "0.9.0", + "bifunctors": "6.0.0", + "bigints": "7.0.1", + "bolson": "0.3.9", + "bookhound": "0.1.7", + "bower-json": "3.0.0", + "call-by-name": "4.0.1", + "canvas": "6.0.0", + "canvas-action": "9.0.0", + "cartesian": "1.0.6", + "catenable-lists": "7.0.0", + "cbor-stream": "1.3.0", + "chameleon": "1.0.0", + "chameleon-halogen": "1.0.3", + "chameleon-react-basic": "1.1.0", + "chameleon-styled": "2.5.0", + "chameleon-transformers": "1.0.0", + "channel": "1.0.0", + "checked-exceptions": "3.1.1", + "choku": "1.0.2", + "classless": "0.1.1", + "classless-arbitrary": "0.1.1", + "classless-decode-json": "0.1.1", + "classless-encode-json": "0.1.3", + "classnames": "2.0.0", + "codec": "6.1.0", + "codec-argonaut": "10.0.0", + "codec-json": "2.0.0", + "colors": "7.0.1", + "concur-core": "0.5.0", + "concur-react": "0.5.0", + "concurrent-queues": "3.0.0", + "console": "6.1.0", + "const": "6.0.0", + "contravariant": "6.0.0", + "control": "6.0.0", + "convertable-options": "1.0.0", + "coroutines": "7.0.0", + "css": "6.0.0", + "css-frameworks": "1.0.1", + "csv-stream": "2.3.0", + "data-mvc": "0.0.2", + "datetime": "6.1.0", + "datetime-parsing": "0.2.0", + "debounce": "0.1.0", + "debug": "6.0.2", + "decimals": "7.1.0", + "default-values": "1.0.1", + "deku": "0.9.23", + "deno": "0.0.5", + "dissect": "1.0.0", + "distributive": "6.0.0", + "dom-filereader": "7.0.0", + "dom-indexed": "12.0.0", + "dom-simple": "0.4.0", + "dotenv": "4.0.3", + "droplet": "0.6.0", + "dts": "1.0.0", + "dual-numbers": "1.0.3", + "dynamic-buffer": "3.0.1", + "echarts-simple": "0.0.1", + "effect": "4.0.0", + "either": "6.1.0", + "elmish": "0.13.0", + "elmish-enzyme": "0.1.1", + "elmish-hooks": "0.10.3", + "elmish-html": "0.9.0", + "elmish-testing-library": "0.3.2", + "email-validate": "7.0.0", + "encoding": "0.0.9", + "enums": "6.0.1", + "env-names": "0.4.0", + "error": "2.0.0", + "eta-conversion": "0.3.2", + "exceptions": "6.1.0", + "exists": "6.0.0", + "exitcodes": "4.0.0", + "expect-inferred": "3.0.0", + "ezfetch": "1.1.0", + "fahrtwind": "2.0.0", + "fallback": "0.1.0", + "fast-vect": "1.2.0", + "fetch": "4.1.0", + "fetch-argonaut": "1.0.1", + "fetch-core": "5.1.0", + "fetch-yoga-json": "1.1.0", + "ffi-simple": "0.5.1", + "fft-js": "0.1.0", + "filterable": "5.0.0", + "fix-functor": "0.1.0", + "fixed-points": "7.0.0", + "fixed-precision": "5.0.0", + "flame": "1.3.0", + "float32": "2.0.0", + "fmt": "0.2.1", + "foldable-traversable": "6.0.0", + "foldable-traversable-extra": "0.0.6", + "foreign": "7.0.0", + "foreign-object": "4.1.0", + "foreign-readwrite": "3.4.0", + "forgetmenot": "0.1.0", + "fork": "6.0.0", + "form-urlencoded": "7.0.0", + "formatters": "7.0.0", + "framer-motion": "1.0.1", + "free": "7.1.0", + "freeap": "7.0.0", + "freer-free": "0.0.1", + "freet": "7.0.0", + "functions": "6.0.0", + "functor1": "3.0.0", + "functors": "5.0.0", + "fuzzy": "0.4.0", + "gen": "4.0.0", + "generate-values": "1.0.1", + "generic-router": "0.0.1", + "geojson": "0.0.5", + "geometria": "2.2.0", + "gojs": "0.1.1", + "grain": "3.0.0", + "grain-router": "3.0.0", + "grain-virtualized": "3.0.0", + "graphs": "8.1.0", + "group": "4.1.1", + "halogen": "7.0.0", + "halogen-bootstrap5": "5.3.2", + "halogen-canvas": "1.0.0", + "halogen-css": "10.0.0", + "halogen-echarts-simple": "0.0.4", + "halogen-formless": "4.0.3", + "halogen-helix": "1.0.1", + "halogen-hooks": "0.6.3", + "halogen-hooks-extra": "0.9.0", + "halogen-infinite-scroll": "1.1.0", + "halogen-store": "0.5.4", + "halogen-storybook": "2.0.0", + "halogen-subscriptions": "2.0.0", + "halogen-svg-elems": "8.0.0", + "halogen-typewriter": "1.0.4", + "halogen-vdom": "8.0.0", + "halogen-vdom-string-renderer": "0.5.0", + "halogen-xterm": "2.0.0", + "heckin": "2.0.1", + "heterogeneous": "0.6.0", + "homogeneous": "0.4.0", + "http-methods": "6.0.0", + "httpurple": "4.0.0", + "huffman": "0.4.0", + "humdrum": "0.0.1", + "hyrule": "2.3.8", + "identity": "6.0.0", + "identy": "4.0.1", + "indexed-db": "1.0.0", + "indexed-monad": "3.0.0", + "int64": "3.0.0", + "integers": "6.0.0", + "interpolate": "5.0.2", + "intersection-observer": "1.0.1", + "invariant": "6.0.0", + "jarilo": "1.0.1", + "jelly": "0.10.0", + "jelly-router": "0.3.0", + "jelly-signal": "0.4.0", + "jest": "1.0.0", + "js-abort-controller": "1.0.0", + "js-bigints": "2.2.1", + "js-date": "8.0.0", + "js-fetch": "0.2.1", + "js-fileio": "3.0.0", + "js-intl": "1.1.4", + "js-iterators": "0.1.1", + "js-maps": "0.1.2", + "js-promise": "1.0.0", + "js-promise-aff": "1.0.0", + "js-timers": "6.1.0", + "js-uri": "3.1.0", + "jsdom": "1.0.0", + "json": "1.1.0", + "json-codecs": "5.0.0", + "justifill": "0.5.0", + "jwt": "0.0.9", + "labeled-data": "0.2.0", + "language-cst-parser": "0.14.0", + "lazy": "6.0.0", + "lazy-joe": "1.0.0", + "lcg": "4.0.0", + "leibniz": "5.0.0", + "leveldb": "1.0.1", + "liminal": "1.0.1", + "linalg": "6.0.0", + "lists": "7.0.0", + "literals": "1.0.2", + "logging": "3.0.0", + "logging-journald": "0.4.0", + "lumi-components": "18.0.0", + "machines": "7.0.0", + "maps-eager": "0.5.0", + "marionette": "1.0.0", + "marionette-react-basic-hooks": "0.1.1", + "marked": "0.1.0", + "matrices": "5.0.1", + "matryoshka": "1.0.0", + "maybe": "6.0.0", + "media-types": "6.0.0", + "meowclient": "1.0.0", + "midi": "4.0.0", + "milkis": "9.0.0", + "minibench": "4.0.1", + "mmorph": "7.0.0", + "monad-control": "5.0.0", + "monad-logger": "1.3.1", + "monad-loops": "0.5.0", + "monad-unlift": "1.0.1", + "monoid-extras": "0.0.1", + "monoidal": "0.16.0", + "morello": "0.4.0", + "mote": "3.0.0", + "motsunabe": "2.0.0", + "mvc": "0.0.1", + "mysql": "6.0.1", + "n3": "0.1.0", + "nano-id": "1.1.0", + "nanoid": "0.1.0", + "naturals": "3.0.0", + "nested-functor": "0.2.1", + "newtype": "5.0.0", + "nextjs": "0.1.1", + "nextui": "0.2.0", + "node-buffer": "9.0.0", + "node-child-process": "11.1.0", + "node-event-emitter": "3.0.0", + "node-execa": "5.0.0", + "node-fs": "9.2.0", + "node-glob-basic": "1.3.0", + "node-http": "9.1.0", + "node-http2": "1.1.1", + "node-human-signals": "1.0.0", + "node-net": "5.1.0", + "node-os": "5.1.0", + "node-path": "5.0.0", + "node-process": "11.2.0", + "node-readline": "8.1.1", + "node-sqlite3": "8.0.0", + "node-stream-pipes": "2.1.6", + "node-streams": "9.0.0", + "node-tls": "0.3.1", + "node-url": "7.0.1", + "node-zlib": "0.4.0", + "nonempty": "7.0.0", + "now": "6.0.0", + "npm-package-json": "2.0.0", + "nullable": "6.0.0", + "numberfield": "0.2.2", + "numbers": "9.0.1", + "oak": "3.1.1", + "oak-debug": "1.2.2", + "object-maps": "0.3.0", + "ocarina": "1.5.4", + "oooooooooorrrrrrrmm-lib": "0.0.1", + "open-colors-scales-and-schemes": "1.0.0", + "open-folds": "6.4.0", + "open-foreign-generic": "11.0.3", + "open-memoize": "6.2.0", + "open-mkdirp-aff": "1.2.0", + "open-pairing": "6.2.0", + "open-smolder": "12.0.2", + "options": "7.0.0", + "optparse": "5.0.1", + "ordered-collections": "3.2.0", + "ordered-set": "0.4.0", + "orders": "6.0.0", + "owoify": "1.2.0", + "pairs": "9.0.1", + "parallel": "7.0.0", + "parsing": "10.2.0", + "parsing-dataview": "3.2.4", + "partial": "4.0.0", + "pathy": "9.0.0", + "pha": "0.13.0", + "phaser": "0.7.0", + "phylio": "1.1.2", + "pipes": "8.0.0", + "pirates-charm": "0.0.1", + "pmock": "0.9.0", + "point-free": "1.0.0", + "pointed-list": "0.5.1", + "polymorphic-vectors": "4.0.0", + "posix-types": "6.0.0", + "postgresql": "2.0.20", + "precise": "6.0.0", + "precise-datetime": "7.0.0", + "prelude": "6.0.1", + "prettier-printer": "3.0.0", + "printf": "0.1.0", + "priority-queue": "0.1.2", + "profunctor": "6.0.1", + "profunctor-lenses": "8.0.0", + "protobuf": "4.4.0", + "psa-utils": "8.0.0", + "psci-support": "6.0.0", + "punycode": "1.0.0", + "qualified-do": "2.2.0", + "quantities": "12.2.0", + "quickcheck": "8.0.1", + "quickcheck-combinators": "0.1.3", + "quickcheck-laws": "7.0.0", + "quickcheck-utf8": "0.0.0", + "random": "6.0.0", + "rationals": "6.0.0", + "rdf": "0.1.0", + "react": "11.0.0", + "react-aria": "0.2.0", + "react-basic": "17.0.0", + "react-basic-classic": "3.0.0", + "react-basic-dnd": "10.1.0", + "react-basic-dom": "7.0.0", + "react-basic-dom-beta": "0.1.1", + "react-basic-emotion": "7.1.0", + "react-basic-hooks": "8.2.0", + "react-basic-storybook": "2.0.0", + "react-dom": "8.0.0", + "react-halo": "3.0.0", + "react-icons": "1.1.5", + "react-markdown": "0.1.0", + "react-testing-library": "4.0.1", + "react-virtuoso": "1.0.0", + "reactix": "0.6.1", + "read": "1.0.1", + "recharts": "1.1.0", + "record": "4.0.0", + "record-extra": "5.0.1", + "record-ptional-fields": "0.1.2", + "record-studio": "1.0.4", + "refs": "6.0.0", + "remotedata": "5.0.1", + "repr": "0.5.0", + "resize-observer": "1.0.0", + "resource": "2.0.1", + "resourcet": "1.0.0", + "result": "1.0.3", + "return": "0.2.0", + "ring-modules": "5.0.1", + "rito": "0.3.4", + "roman": "0.4.0", + "rough-notation": "1.0.2", + "routing": "11.0.0", + "routing-duplex": "0.7.0", + "run": "5.0.0", + "safe-coerce": "2.0.0", + "safely": "4.0.1", + "school-of-music": "1.3.0", + "selection-foldable": "0.2.0", + "selective-functors": "1.0.1", + "semirings": "7.0.0", + "signal": "13.0.0", + "simple-emitter": "3.0.1", + "simple-i18n": "2.0.1", + "simple-json": "9.0.0", + "simple-json-generics": "0.2.1", + "simple-ulid": "3.0.0", + "sized-matrices": "1.0.0", + "sized-vectors": "5.0.2", + "slug": "3.1.0", + "small-ffi": "4.0.1", + "soundfonts": "4.1.0", + "sparse-matrices": "2.0.1", + "sparse-polynomials": "3.0.1", + "spec": "8.1.1", + "spec-discovery": "8.4.0", + "spec-mocha": "5.1.1", + "spec-node": "0.0.3", + "spec-quickcheck": "5.0.2", + "spec-reporter-xunit": "0.7.1", + "splitmix": "2.1.0", + "ssrs": "1.0.0", + "st": "6.2.0", + "statistics": "0.3.2", + "strictlypositiveint": "1.0.1", + "string-parsers": "8.0.0", + "strings": "6.0.1", + "strings-extra": "4.0.0", + "stringutils": "0.0.12", + "substitute": "0.2.3", + "supply": "0.2.0", + "svg-parser": "3.0.0", + "systemd-journald": "0.3.0", + "tagged": "4.0.2", + "tailrec": "6.1.0", + "tecton": "0.2.1", + "tecton-halogen": "0.2.0", + "test-unit": "17.0.0", + "thermite": "6.3.1", + "thermite-dom": "0.3.1", + "these": "6.0.0", + "threading": "0.0.3", + "tldr": "0.0.0", + "toestand": "0.9.0", + "transformation-matrix": "1.0.1", + "transformers": "6.1.0", + "tree-rose": "4.0.2", + "ts-bridge": "4.0.0", + "tuples": "7.0.0", + "two-or-more": "1.0.0", + "type-equality": "4.0.1", + "typedenv": "2.0.1", + "typelevel": "6.0.0", + "typelevel-lists": "2.1.0", + "typelevel-peano": "1.0.1", + "typelevel-prelude": "7.0.0", + "typelevel-regex": "0.0.3", + "typelevel-rows": "0.1.0", + "typisch": "0.4.0", + "uint": "7.0.0", + "ulid": "3.0.1", + "uncurried-transformers": "1.1.0", + "undefined": "2.0.0", + "undefined-is-not-a-problem": "1.1.0", + "unfoldable": "6.0.0", + "unicode": "6.0.0", + "unique": "0.6.1", + "unlift": "1.0.1", + "unordered-collections": "3.1.0", + "unsafe-coerce": "6.0.0", + "unsafe-reference": "5.0.0", + "untagged-to-tagged": "0.1.4", + "untagged-union": "1.0.0", + "uri": "9.0.0", + "url-immutable": "1.0.0", + "uuid": "9.0.0", + "uuidv4": "1.0.0", + "validation": "6.0.0", + "variant": "8.0.0", + "variant-encodings": "2.0.0", + "vectorfield": "1.0.1", + "vectors": "2.1.0", + "versions": "7.0.0", + "visx": "0.0.2", + "web-clipboard": "6.0.0", + "web-cssom": "2.0.0", + "web-cssom-view": "0.1.0", + "web-dom": "6.0.0", + "web-dom-parser": "8.0.0", + "web-dom-xpath": "3.0.0", + "web-encoding": "3.0.0", + "web-events": "4.0.0", + "web-fetch": "4.0.1", + "web-file": "4.0.0", + "web-geometry": "0.1.0", + "web-html": "4.1.0", + "web-pointerevents": "2.0.0", + "web-proletarian": "1.0.0", + "web-promise": "3.2.0", + "web-resize-observer": "2.1.0", + "web-router": "1.0.0", + "web-socket": "4.0.0", + "web-storage": "5.0.0", + "web-streams": "4.0.0", + "web-touchevents": "4.0.0", + "web-uievents": "5.0.0", + "web-url": "2.0.0", + "web-workers": "1.1.0", + "web-xhr": "5.0.1", + "webextension-polyfill": "0.1.0", + "webgpu": "0.0.1", + "which": "2.0.0", + "xterm": "1.0.0", + "yoga-fetch": "1.0.1", + "yoga-json": "5.1.0", + "yoga-om": "0.1.0", + "yoga-postgres": "6.0.0", + "yoga-subtlecrypto": "0.1.0", + "yoga-tree": "1.0.0", + "z3": "0.0.2", + "zipperarray": "2.0.0" + } + }, + "extra_packages": { + "format": { + "git": "https://github.com/feramhq/purescript-format", + "ref": "3b0fc6c74f439fc3ad7fc7c88fc6f73b083f82e2", + "dependencies": [ + "control", + "effect", + "integers", + "maybe", + "numbers", + "prelude", + "strings", + "test-unit", + "unfoldable" + ] + }, + "markdown-it": { + "git": "https://github.com/nonbili/purescript-markdown-it", + "ref": "f6e8ee91298f2fc13c4277e75a19e0538de5f7a2", + "dependencies": [ + "effect", + "foldable-traversable", + "foreign", + "jest", + "node-process", + "options", + "prelude", + "psci-support", + "tuples" + ] + }, + "node-fs-extra": { + "git": "https://github.com/ad-si/purescript-node-fs-extra", + "ref": "4985e50936bc142d998c616554df3acf820c0cbc", + "dependencies": [ + "aff-promise", + "node-buffer", + "node-path" + ] + }, + "yaml-next": { + "git": "https://github.com/archaeron/purescript-yaml-next", + "ref": "cd4833a32458e06ebb4338c3e00f98723c681891", + "dependencies": [ + "argonaut-codecs", + "argonaut-core", + "console", + "effect", + "foreign", + "functions", + "ordered-collections", + "psci-support", + "spec", + "unsafe-coerce" + ] + } + } + }, + "packages": { + "aff": { + "type": "registry", + "version": "8.0.0", + "integrity": "sha256-5MmdI4+0RHBtSBy+YlU3/Cq4R5W2ih3OaRedJIrVHdk=", + "dependencies": [ + "bifunctors", + "control", + "datetime", + "effect", + "either", + "exceptions", + "foldable-traversable", + "functions", + "maybe", + "newtype", + "parallel", + "prelude", + "refs", + "tailrec", + "transformers", + "unsafe-coerce" + ] + }, + "aff-promise": { + "type": "registry", + "version": "4.0.0", + "integrity": "sha256-Kq5EupbUpXeUXx4JqGQE7/RTTz/H6idzWhsocwlEFhM=", + "dependencies": [ + "aff", + "foreign" + ] + }, + "ansi": { + "type": "registry", + "version": "7.0.0", + "integrity": "sha256-ZMB6HD+q9CXvn9fRCmJ8dvuDrOVHcjombL3oNOerVnE=", + "dependencies": [ + "foldable-traversable", + "lists", + "strings" + ] + }, + "argonaut-codecs": { + "type": "registry", + "version": "9.1.0", + "integrity": "sha256-N6efXByUeg848ompEqJfVvZuZPfdRYDGlTDFn0G0Oh8=", + "dependencies": [ + "argonaut-core", + "arrays", + "effect", + "foreign-object", + "identity", + "integers", + "maybe", + "nonempty", + "ordered-collections", + "prelude", + "record" + ] + }, + "argonaut-core": { + "type": "registry", + "version": "7.0.0", + "integrity": "sha256-RC82GfAjItydxrO24cdX373KHVZiLqybu19b5X8u7B4=", + "dependencies": [ + "arrays", + "control", + "either", + "foreign-object", + "functions", + "gen", + "maybe", + "nonempty", + "prelude", + "strings", + "tailrec" + ] + }, + "argonaut-generic": { + "type": "registry", + "version": "8.0.0", + "integrity": "sha256-WCqRWoomRKg5BFZnGBS4k4SqBX84fy/X1aJzMyaIeP0=", + "dependencies": [ + "argonaut-codecs", + "argonaut-core", + "prelude", + "record" + ] + }, + "arraybuffer-types": { + "type": "registry", + "version": "3.0.2", + "integrity": "sha256-mQKokysYVkooS4uXbO+yovmV/s8b138Ws3zQvOwIHRA=", + "dependencies": [] + }, + "arrays": { + "type": "registry", + "version": "7.3.0", + "integrity": "sha256-tmcklBlc/muUtUfr9RapdCPwnlQeB3aSrC4dK85gQlc=", + "dependencies": [ + "bifunctors", + "control", + "foldable-traversable", + "functions", + "maybe", + "nonempty", + "partial", + "prelude", + "safe-coerce", + "st", + "tailrec", + "tuples", + "unfoldable", + "unsafe-coerce" + ] + }, + "avar": { + "type": "registry", + "version": "5.0.0", + "integrity": "sha256-e7hf0x4hEpcygXP0LtvfvAQ49Bbj2aWtZT3gqM///0A=", + "dependencies": [ + "aff", + "effect", + "either", + "exceptions", + "functions", + "maybe" + ] + }, + "bifunctors": { + "type": "registry", + "version": "6.0.0", + "integrity": "sha256-/gZwC9YhNxZNQpnHa5BIYerCGM2jeX9ukZiEvYxm5Nw=", + "dependencies": [ + "const", + "either", + "newtype", + "prelude", + "tuples" + ] + }, + "catenable-lists": { + "type": "registry", + "version": "7.0.0", + "integrity": "sha256-76vYENhwF4BWTBsjeLuErCH2jqVT4M3R1HX+4RwSftA=", + "dependencies": [ + "control", + "foldable-traversable", + "lists", + "maybe", + "prelude", + "tuples", + "unfoldable" + ] + }, + "console": { + "type": "registry", + "version": "6.1.0", + "integrity": "sha256-CxmAzjgyuGDmt9FZW51VhV6rBPwR6o0YeKUzA9rSzcM=", + "dependencies": [ + "effect", + "prelude" + ] + }, + "const": { + "type": "registry", + "version": "6.0.0", + "integrity": "sha256-tNrxDW8D8H4jdHE2HiPzpLy08zkzJMmGHdRqt5BQuTc=", + "dependencies": [ + "invariant", + "newtype", + "prelude" + ] + }, + "contravariant": { + "type": "registry", + "version": "6.0.0", + "integrity": "sha256-TP+ooAp3vvmdjfQsQJSichF5B4BPDHp3wAJoWchip6c=", + "dependencies": [ + "const", + "either", + "newtype", + "prelude", + "tuples" + ] + }, + "control": { + "type": "registry", + "version": "6.0.0", + "integrity": "sha256-sH7Pg9E96JCPF9PIA6oQ8+BjTyO/BH1ZuE/bOcyj4Jk=", + "dependencies": [ + "newtype", + "prelude" + ] + }, + "datetime": { + "type": "registry", + "version": "6.1.0", + "integrity": "sha256-g/5X5BBegQWLpI9IWD+sY6mcaYpzzlW5lz5NBzaMtyI=", + "dependencies": [ + "bifunctors", + "control", + "either", + "enums", + "foldable-traversable", + "functions", + "gen", + "integers", + "lists", + "maybe", + "newtype", + "numbers", + "ordered-collections", + "partial", + "prelude", + "tuples" + ] + }, + "debug": { + "type": "registry", + "version": "6.0.2", + "integrity": "sha256-vmkYFuXYuELBzeauvgHG6E6Kf/Hp1dAnxwE9ByHfwSg=", + "dependencies": [ + "functions", + "prelude" + ] + }, + "distributive": { + "type": "registry", + "version": "6.0.0", + "integrity": "sha256-HTDdmEnzigMl+02SJB88j+gAXDx9VKsbvR4MJGDPbOQ=", + "dependencies": [ + "identity", + "newtype", + "prelude", + "tuples", + "type-equality" + ] + }, + "effect": { + "type": "registry", + "version": "4.0.0", + "integrity": "sha256-eBtZu+HZcMa5HilvI6kaDyVX3ji8p0W9MGKy2K4T6+M=", + "dependencies": [ + "prelude" + ] + }, + "either": { + "type": "registry", + "version": "6.1.0", + "integrity": "sha256-6hgTPisnMWVwQivOu2PKYcH8uqjEOOqDyaDQVUchTpY=", + "dependencies": [ + "control", + "invariant", + "maybe", + "prelude" + ] + }, + "enums": { + "type": "registry", + "version": "6.0.1", + "integrity": "sha256-HWaD73JFLorc4A6trKIRUeDMdzE+GpkJaEOM1nTNkC8=", + "dependencies": [ + "control", + "either", + "gen", + "maybe", + "newtype", + "nonempty", + "partial", + "prelude", + "tuples", + "unfoldable" + ] + }, + "exceptions": { + "type": "registry", + "version": "6.1.0", + "integrity": "sha256-K0T89IHtF3vBY7eSAO7eDOqSb2J9kZGAcDN5+IKsF8E=", + "dependencies": [ + "effect", + "either", + "maybe", + "prelude" + ] + }, + "exists": { + "type": "registry", + "version": "6.0.0", + "integrity": "sha256-A0JQHpTfo1dNOj9U5/Fd3xndlRSE0g2IQWOGor2yXn8=", + "dependencies": [ + "unsafe-coerce" + ] + }, + "fixed-points": { + "type": "registry", + "version": "7.0.0", + "integrity": "sha256-hTl5fzeG4mzAOFzEzAeNH7kJvJgYCH7x3v2NdX9pOE4=", + "dependencies": [ + "exists", + "newtype", + "prelude", + "transformers" + ] + }, + "foldable-traversable": { + "type": "registry", + "version": "6.0.0", + "integrity": "sha256-fLeqRYM4jUrZD5H4WqcwUgzU7XfYkzO4zhgtNc3jcWM=", + "dependencies": [ + "bifunctors", + "const", + "control", + "either", + "functors", + "identity", + "maybe", + "newtype", + "orders", + "prelude", + "tuples" + ] + }, + "foreign": { + "type": "registry", + "version": "7.0.0", + "integrity": "sha256-1ORiqoS3HW+qfwSZAppHPWy4/6AQysxZ2t29jcdUMNA=", + "dependencies": [ + "either", + "functions", + "identity", + "integers", + "lists", + "maybe", + "prelude", + "strings", + "transformers" + ] + }, + "foreign-object": { + "type": "registry", + "version": "4.1.0", + "integrity": "sha256-q24okj6mT+yGHYQ+ei/pYPj5ih6sTbu7eDv/WU56JVo=", + "dependencies": [ + "arrays", + "foldable-traversable", + "functions", + "gen", + "lists", + "maybe", + "prelude", + "st", + "tailrec", + "tuples", + "typelevel-prelude", + "unfoldable" + ] + }, + "fork": { + "type": "registry", + "version": "6.0.0", + "integrity": "sha256-X7u0SuCvFbLbzuNEKLBNuWjmcroqMqit4xEzpQwAP7E=", + "dependencies": [ + "aff" + ] + }, + "format": { + "type": "git", + "url": "https://github.com/feramhq/purescript-format", + "rev": "3b0fc6c74f439fc3ad7fc7c88fc6f73b083f82e2", + "dependencies": [ + "control", + "effect", + "integers", + "maybe", + "numbers", + "prelude", + "strings", + "test-unit", + "unfoldable" + ] + }, + "formatters": { + "type": "registry", + "version": "7.0.0", + "integrity": "sha256-5JaC9d2p0xoqJWjWxlHH19R4iJwFTBr4j7SlYcLgicE=", + "dependencies": [ + "datetime", + "fixed-points", + "lists", + "numbers", + "parsing", + "prelude", + "transformers" + ] + }, + "free": { + "type": "registry", + "version": "7.1.0", + "integrity": "sha256-JAumgEsGSzJCNLD8AaFvuX7CpqS5yruCngi6yI7+V5k=", + "dependencies": [ + "catenable-lists", + "control", + "distributive", + "either", + "exists", + "foldable-traversable", + "invariant", + "lazy", + "maybe", + "prelude", + "tailrec", + "transformers", + "tuples", + "unsafe-coerce" + ] + }, + "functions": { + "type": "registry", + "version": "6.0.0", + "integrity": "sha256-adMyJNEnhGde2unHHAP79gPtlNjNqzgLB8arEOn9hLI=", + "dependencies": [ + "prelude" + ] + }, + "functors": { + "type": "registry", + "version": "5.0.0", + "integrity": "sha256-zfPWWYisbD84MqwpJSZFlvM6v86McM68ob8p9s27ywU=", + "dependencies": [ + "bifunctors", + "const", + "contravariant", + "control", + "distributive", + "either", + "invariant", + "maybe", + "newtype", + "prelude", + "profunctor", + "tuples", + "unsafe-coerce" + ] + }, + "gen": { + "type": "registry", + "version": "4.0.0", + "integrity": "sha256-f7yzAXWwr+xnaqEOcvyO3ezKdoes8+WXWdXIHDBCAPI=", + "dependencies": [ + "either", + "foldable-traversable", + "identity", + "maybe", + "newtype", + "nonempty", + "prelude", + "tailrec", + "tuples", + "unfoldable" + ] + }, + "identity": { + "type": "registry", + "version": "6.0.0", + "integrity": "sha256-4wY0XZbAksjY6UAg99WkuKyJlQlWAfTi2ssadH0wVMY=", + "dependencies": [ + "control", + "invariant", + "newtype", + "prelude" + ] + }, + "integers": { + "type": "registry", + "version": "6.0.0", + "integrity": "sha256-sf+sK26R1hzwl3NhXR7WAu9zCDjQnfoXwcyGoseX158=", + "dependencies": [ + "maybe", + "numbers", + "prelude" + ] + }, + "invariant": { + "type": "registry", + "version": "6.0.0", + "integrity": "sha256-RGWWyYrz0Hs1KjPDA+87Kia67ZFBhfJ5lMGOMCEFoLo=", + "dependencies": [ + "control", + "prelude" + ] + }, + "jest": { + "type": "registry", + "version": "1.0.0", + "integrity": "sha256-xw1qzdzazYZVGUoRi6r0qUDC8rgmlhiiRpBCXu1qLrQ=", + "dependencies": [ + "aff", + "aff-promise", + "effect", + "prelude" + ] + }, + "js-bigints": { + "type": "registry", + "version": "2.2.1", + "integrity": "sha256-hKWZo9NxtsAaHmNXr6B8GY4c0olQbYLXPVGWm4TF2Ss=", + "dependencies": [ + "integers", + "maybe", + "prelude" + ] + }, + "js-date": { + "type": "registry", + "version": "8.0.0", + "integrity": "sha256-6TVF4DWg5JL+jRAsoMssYw8rgOVALMUHT1CuNZt8NRo=", + "dependencies": [ + "datetime", + "effect", + "exceptions", + "foreign", + "integers", + "now" + ] + }, + "js-timers": { + "type": "registry", + "version": "6.1.0", + "integrity": "sha256-znHWLSSOYw15P5DTcsAdal2lf7nGA2yayLdOZ2t5r7o=", + "dependencies": [ + "effect" + ] + }, + "lazy": { + "type": "registry", + "version": "6.0.0", + "integrity": "sha256-lMsfFOnlqfe4KzRRiW8ot5ge6HtcU3Eyh2XkXcP5IgU=", + "dependencies": [ + "control", + "foldable-traversable", + "invariant", + "prelude" + ] + }, + "lcg": { + "type": "registry", + "version": "4.0.0", + "integrity": "sha256-h7ME5cthLfbgJOJdsZcSfFpwXsx4rf8YmhebU+3iSYg=", + "dependencies": [ + "effect", + "integers", + "maybe", + "partial", + "prelude", + "random" + ] + }, + "lists": { + "type": "registry", + "version": "7.0.0", + "integrity": "sha256-EKF15qYqucuXP2lT/xPxhqy58f0FFT6KHdIB/yBOayI=", + "dependencies": [ + "bifunctors", + "control", + "foldable-traversable", + "lazy", + "maybe", + "newtype", + "nonempty", + "partial", + "prelude", + "tailrec", + "tuples", + "unfoldable" + ] + }, + "markdown-it": { + "type": "git", + "url": "https://github.com/nonbili/purescript-markdown-it", + "rev": "f6e8ee91298f2fc13c4277e75a19e0538de5f7a2", + "dependencies": [ + "effect", + "foldable-traversable", + "foreign", + "jest", + "node-process", + "options", + "prelude", + "psci-support", + "tuples" + ] + }, + "maybe": { + "type": "registry", + "version": "6.0.0", + "integrity": "sha256-5cCIb0wPwbat2PRkQhUeZO0jcAmf8jCt2qE0wbC3v2Q=", + "dependencies": [ + "control", + "invariant", + "newtype", + "prelude" + ] + }, + "mmorph": { + "type": "registry", + "version": "7.0.0", + "integrity": "sha256-urZlZNNqGeQFe5D/ClHlR8QgGBNHTMFPtJ5S5IpflTQ=", + "dependencies": [ + "free", + "functors", + "transformers" + ] + }, + "newtype": { + "type": "registry", + "version": "5.0.0", + "integrity": "sha256-gdrQu8oGe9eZE6L3wOI8ql/igOg+zEGB5ITh2g+uttw=", + "dependencies": [ + "prelude", + "safe-coerce" + ] + }, + "node-buffer": { + "type": "registry", + "version": "9.0.0", + "integrity": "sha256-PWE2DJ5ruBLCmeA/fUiuySEFmUJ/VuRfyrnCuVZBlu4=", + "dependencies": [ + "arraybuffer-types", + "effect", + "maybe", + "nullable", + "st", + "unsafe-coerce" + ] + }, + "node-event-emitter": { + "type": "registry", + "version": "3.0.0", + "integrity": "sha256-Qw0MjsT4xRH2j2i4K8JmRjcMKnH5z1Cw39t00q4LE4w=", + "dependencies": [ + "effect", + "either", + "functions", + "maybe", + "nullable", + "prelude", + "unsafe-coerce" + ] + }, + "node-fs": { + "type": "registry", + "version": "9.2.0", + "integrity": "sha256-Sg0vkXycEzkEerX6hLccz21Ygd9w1+QSk1thotRZPGI=", + "dependencies": [ + "datetime", + "effect", + "either", + "enums", + "exceptions", + "functions", + "integers", + "js-date", + "maybe", + "node-buffer", + "node-path", + "node-streams", + "nullable", + "partial", + "prelude", + "strings", + "unsafe-coerce" + ] + }, + "node-fs-extra": { + "type": "git", + "url": "https://github.com/ad-si/purescript-node-fs-extra", + "rev": "4985e50936bc142d998c616554df3acf820c0cbc", + "dependencies": [ + "aff-promise", + "node-buffer", + "node-path" + ] + }, + "node-path": { + "type": "registry", + "version": "5.0.0", + "integrity": "sha256-pd82nQ+2l5UThzaxPdKttgDt7xlsgIDLpPG0yxDEdyE=", + "dependencies": [ + "effect" + ] + }, + "node-process": { + "type": "registry", + "version": "11.2.0", + "integrity": "sha256-+2MQDYChjGbVbapCyJtuWYwD41jk+BntF/kcOTKBMVs=", + "dependencies": [ + "effect", + "foreign", + "foreign-object", + "maybe", + "node-event-emitter", + "node-streams", + "posix-types", + "prelude", + "unsafe-coerce" + ] + }, + "node-streams": { + "type": "registry", + "version": "9.0.0", + "integrity": "sha256-2n6dq7YWleTDmD1Kur/ul7Cn08IvWrScgPf+0PgX2TQ=", + "dependencies": [ + "aff", + "effect", + "either", + "exceptions", + "node-buffer", + "node-event-emitter", + "nullable", + "prelude" + ] + }, + "nonempty": { + "type": "registry", + "version": "7.0.0", + "integrity": "sha256-54ablJZUHGvvlTJzi3oXyPCuvY6zsrWJuH/dMJ/MFLs=", + "dependencies": [ + "control", + "foldable-traversable", + "maybe", + "prelude", + "tuples", + "unfoldable" + ] + }, + "now": { + "type": "registry", + "version": "6.0.0", + "integrity": "sha256-xZ7x37ZMREfs6GCDw/h+FaKHV/3sPWmtqBZRGTxybQY=", + "dependencies": [ + "datetime", + "effect" + ] + }, + "nullable": { + "type": "registry", + "version": "6.0.0", + "integrity": "sha256-yiGBVl3AD+Guy4kNWWeN+zl1gCiJK+oeIFtZtPCw4+o=", + "dependencies": [ + "effect", + "functions", + "maybe" + ] + }, + "numbers": { + "type": "registry", + "version": "9.0.1", + "integrity": "sha256-/9M6aeMDBdB4cwYDeJvLFprAHZ49EbtKQLIJsneXLIk=", + "dependencies": [ + "functions", + "maybe" + ] + }, + "options": { + "type": "registry", + "version": "7.0.0", + "integrity": "sha256-treC6h+jvzcWhplPaF/aMENCOx+JGk+ysa5pL1BGHtg=", + "dependencies": [ + "contravariant", + "foreign", + "foreign-object", + "maybe", + "tuples" + ] + }, + "ordered-collections": { + "type": "registry", + "version": "3.2.0", + "integrity": "sha256-o9jqsj5rpJmMdoe/zyufWHFjYYFTTsJpgcuCnqCO6PM=", + "dependencies": [ + "arrays", + "foldable-traversable", + "gen", + "lists", + "maybe", + "partial", + "prelude", + "st", + "tailrec", + "tuples", + "unfoldable" + ] + }, + "orders": { + "type": "registry", + "version": "6.0.0", + "integrity": "sha256-nBA0g3/ai0euH8q9pSbGqk53W2q6agm/dECZTHcoink=", + "dependencies": [ + "newtype", + "prelude" + ] + }, + "parallel": { + "type": "registry", + "version": "7.0.0", + "integrity": "sha256-gUC9i4Txnx9K9RcMLsjujbwZz6BB1bnE2MLvw4GIw5o=", + "dependencies": [ + "control", + "effect", + "either", + "foldable-traversable", + "functors", + "maybe", + "newtype", + "prelude", + "profunctor", + "refs", + "transformers" + ] + }, + "parsing": { + "type": "registry", + "version": "10.2.0", + "integrity": "sha256-ZDIdMFAKkst57x6BVa1aUWJnS8smoZnXsZ339Aq1mPA=", + "dependencies": [ + "arrays", + "control", + "effect", + "either", + "enums", + "foldable-traversable", + "functions", + "identity", + "integers", + "lazy", + "lists", + "maybe", + "newtype", + "nullable", + "numbers", + "partial", + "prelude", + "st", + "strings", + "tailrec", + "transformers", + "tuples", + "unfoldable", + "unicode", + "unsafe-coerce" + ] + }, + "partial": { + "type": "registry", + "version": "4.0.0", + "integrity": "sha256-fwXerld6Xw1VkReh8yeQsdtLVrjfGiVuC5bA1Wyo/J4=", + "dependencies": [] + }, + "pipes": { + "type": "registry", + "version": "8.0.0", + "integrity": "sha256-kvfqGM4cPA/wCcBHbp5psouFw5dZGvku2462x7ZBwSY=", + "dependencies": [ + "aff", + "lists", + "mmorph", + "prelude", + "tailrec", + "transformers", + "tuples" + ] + }, + "posix-types": { + "type": "registry", + "version": "6.0.0", + "integrity": "sha256-ZfFz8RR1lee/o/Prccyeut3Q+9tYd08mlR72sIh6GzA=", + "dependencies": [ + "maybe", + "prelude" + ] + }, + "prelude": { + "type": "registry", + "version": "6.0.1", + "integrity": "sha256-o8p6SLYmVPqzXZhQFd2hGAWEwBoXl1swxLG/scpJ0V0=", + "dependencies": [] + }, + "profunctor": { + "type": "registry", + "version": "6.0.1", + "integrity": "sha256-E58hSYdJvF2Qjf9dnWLPlJKh2Z2fLfFLkQoYi16vsFk=", + "dependencies": [ + "control", + "distributive", + "either", + "exists", + "invariant", + "newtype", + "prelude", + "tuples" + ] + }, + "psci-support": { + "type": "registry", + "version": "6.0.0", + "integrity": "sha256-C6ql4P9TEP06hft/1Z5QumPA4yARR4VIxDdhmL1EO+Y=", + "dependencies": [ + "console", + "effect", + "prelude" + ] + }, + "quickcheck": { + "type": "registry", + "version": "8.0.1", + "integrity": "sha256-ZvpccKQCvgslTXZCNmpYW4bUsFzhZd/kQUr2WmxFTGY=", + "dependencies": [ + "arrays", + "console", + "control", + "effect", + "either", + "enums", + "exceptions", + "foldable-traversable", + "gen", + "identity", + "integers", + "lazy", + "lcg", + "lists", + "maybe", + "newtype", + "nonempty", + "numbers", + "partial", + "prelude", + "record", + "st", + "strings", + "tailrec", + "transformers", + "tuples", + "unfoldable" + ] + }, + "random": { + "type": "registry", + "version": "6.0.0", + "integrity": "sha256-CJ611a35MPCE7XQMp0rdC6MCn76znlhisiCRgboAG+Q=", + "dependencies": [ + "effect", + "integers" + ] + }, + "rationals": { + "type": "registry", + "version": "6.0.0", + "integrity": "sha256-58lUkv9LTanrMJ9U/IYf+i4+NibDZb6suVfLOK4OKhA=", + "dependencies": [ + "integers", + "js-bigints", + "prelude" + ] + }, + "record": { + "type": "registry", + "version": "4.0.0", + "integrity": "sha256-Za5U85bTRJEfGK5Sk4hM41oXy84YQI0I8TL3WUn1Qzg=", + "dependencies": [ + "functions", + "prelude", + "unsafe-coerce" + ] + }, + "refs": { + "type": "registry", + "version": "6.0.0", + "integrity": "sha256-Vgwne7jIbD3ZMoLNNETLT8Litw6lIYo3MfYNdtYWj9s=", + "dependencies": [ + "effect", + "prelude" + ] + }, + "result": { + "type": "registry", + "version": "1.0.3", + "integrity": "sha256-z83tw/z/S2Kt7g1YSMk0qXHa0pi/K3qEYm0uiYWcH48=", + "dependencies": [ + "either", + "foldable-traversable", + "prelude" + ] + }, + "safe-coerce": { + "type": "registry", + "version": "2.0.0", + "integrity": "sha256-a1ibQkiUcbODbLE/WAq7Ttbbh9ex+x33VCQ7GngKudU=", + "dependencies": [ + "unsafe-coerce" + ] + }, + "spec": { + "type": "registry", + "version": "8.1.1", + "integrity": "sha256-EM7UfQIaSgiw13LJ4ZASkfYmmRDKIlec3nYbGKFqGhk=", + "dependencies": [ + "aff", + "ansi", + "arrays", + "avar", + "bifunctors", + "control", + "datetime", + "effect", + "either", + "exceptions", + "foldable-traversable", + "fork", + "identity", + "integers", + "lists", + "maybe", + "newtype", + "now", + "ordered-collections", + "parallel", + "pipes", + "prelude", + "refs", + "strings", + "tailrec", + "transformers", + "tuples" + ] + }, + "st": { + "type": "registry", + "version": "6.2.0", + "integrity": "sha256-z9X0WsOUlPwNx9GlCC+YccCyz8MejC8Wb0C4+9fiBRY=", + "dependencies": [ + "partial", + "prelude", + "tailrec", + "unsafe-coerce" + ] + }, + "strings": { + "type": "registry", + "version": "6.0.1", + "integrity": "sha256-WssD3DbX4OPzxSdjvRMX0yvc9+pS7n5gyPv5I2Trb7k=", + "dependencies": [ + "arrays", + "control", + "either", + "enums", + "foldable-traversable", + "gen", + "integers", + "maybe", + "newtype", + "nonempty", + "partial", + "prelude", + "tailrec", + "tuples", + "unfoldable", + "unsafe-coerce" + ] + }, + "stringutils": { + "type": "registry", + "version": "0.0.12", + "integrity": "sha256-t63QWBlp49U0nRqUcFryKflSJsNKGTQAHKjn24/+ooI=", + "dependencies": [ + "arrays", + "integers", + "maybe", + "partial", + "prelude", + "strings" + ] + }, + "tailrec": { + "type": "registry", + "version": "6.1.0", + "integrity": "sha256-Xx19ECVDRrDWpz9D2GxQHHV89vd61dnXxQm0IcYQHGk=", + "dependencies": [ + "bifunctors", + "effect", + "either", + "identity", + "maybe", + "partial", + "prelude", + "refs" + ] + }, + "test-unit": { + "type": "registry", + "version": "17.0.0", + "integrity": "sha256-aITJ2KngFFjASmG0JjnjybaKWl9dn7Hf2B3Wk4engNs=", + "dependencies": [ + "aff", + "avar", + "effect", + "either", + "free", + "js-timers", + "lists", + "prelude", + "quickcheck", + "strings" + ] + }, + "transformers": { + "type": "registry", + "version": "6.1.0", + "integrity": "sha256-3Bm+Z6tsC/paG888XkywDngJ2JMos+JfOhRlkVfb7gI=", + "dependencies": [ + "control", + "distributive", + "effect", + "either", + "exceptions", + "foldable-traversable", + "identity", + "lazy", + "maybe", + "newtype", + "prelude", + "st", + "tailrec", + "tuples", + "unfoldable" + ] + }, + "tuples": { + "type": "registry", + "version": "7.0.0", + "integrity": "sha256-1rXgTomes9105BjgXqIw0FL6Fz1lqqUTLWOumhWec1M=", + "dependencies": [ + "control", + "invariant", + "prelude" + ] + }, + "type-equality": { + "type": "registry", + "version": "4.0.1", + "integrity": "sha256-Hs9D6Y71zFi/b+qu5NSbuadUQXe5iv5iWx0226vOHUw=", + "dependencies": [] + }, + "typelevel-prelude": { + "type": "registry", + "version": "7.0.0", + "integrity": "sha256-uFF2ph+vHcQpfPuPf2a3ukJDFmLhApmkpTMviHIWgJM=", + "dependencies": [ + "prelude", + "type-equality" + ] + }, + "unfoldable": { + "type": "registry", + "version": "6.0.0", + "integrity": "sha256-JtikvJdktRap7vr/K4ITlxUX1QexpnqBq0G/InLr6eg=", + "dependencies": [ + "foldable-traversable", + "maybe", + "partial", + "prelude", + "tuples" + ] + }, + "unicode": { + "type": "registry", + "version": "6.0.0", + "integrity": "sha256-QJnTVZpmihEAUiMeYrfkusVoziJWp2hJsgi9bMQLue8=", + "dependencies": [ + "foldable-traversable", + "maybe", + "strings" + ] + }, + "unsafe-coerce": { + "type": "registry", + "version": "6.0.0", + "integrity": "sha256-IqIYW4Vkevn8sI+6aUwRGvd87tVL36BBeOr0cGAE7t0=", + "dependencies": [] + }, + "yaml-next": { + "type": "git", + "url": "https://github.com/archaeron/purescript-yaml-next", + "rev": "cd4833a32458e06ebb4338c3e00f98723c681891", + "dependencies": [ + "argonaut-codecs", + "argonaut-core", + "console", + "effect", + "foreign", + "functions", + "ordered-collections", + "psci-support", + "spec", + "unsafe-coerce" + ] + } + } +} diff --git a/spago.yaml b/spago.yaml index 25d2306..a523ec0 100644 --- a/spago.yaml +++ b/spago.yaml @@ -20,10 +20,12 @@ package: - functions - js-bigints - lists + - markdown-it - maybe - newtype - node-buffer - node-fs + - node-fs-extra - node-path - node-process - nullable @@ -44,7 +46,7 @@ package: - spec workspace: packageSet: - registry: 47.12.0 + registry: 61.2.0 extraPackages: format: git: https://github.com/feramhq/purescript-format @@ -59,6 +61,26 @@ workspace: - strings - test-unit - unfoldable + markdown-it: + git: https://github.com/nonbili/purescript-markdown-it + ref: f6e8ee91298f2fc13c4277e75a19e0538de5f7a2 + dependencies: + - effect + - foldable-traversable + - foreign + - jest + - node-process + - options + - prelude + - psci-support + - tuples + node-fs-extra: + git: https://github.com/ad-si/purescript-node-fs-extra + ref: 4985e50936bc142d998c616554df3acf820c0cbc + dependencies: + - aff-promise + - node-buffer + - node-path yaml-next: git: https://github.com/archaeron/purescript-yaml-next ref: cd4833a32458e06ebb4338c3e00f98723c681891 diff --git a/src/Build.purs b/src/Build.purs new file mode 100644 index 0000000..f89a022 --- /dev/null +++ b/src/Build.purs @@ -0,0 +1,258 @@ +-- | Build scripts for the project +module Build + ( main + ) where + +import Prelude + +import Data.Array (filter, foldMap, sort) +import Data.Options ((:=)) +import Data.String (Pattern(..), Replacement(..), replace, split, toLower) +import Data.Traversable (for, for_) +import Effect (Effect) +import Effect.Aff (Aff, launchAff_) +import Effect.Class (liftEffect) +import Effect.Console (log) +import MarkdownIt (Preset(..), html, newMarkdownIt, render) +import Node.Encoding (Encoding(UTF8)) +import Node.FS.Aff (copyFile, mkdir', readTextFile, readdir, writeTextFile) +import Node.FS.Extra (copy, remove) +import Node.FS.Perms (permsReadWrite) +import Node.Path (basename, basenameWithoutExt, concat, extname) + +type FileEntry = + { name :: String + , content :: String + } + +commonStyles :: String +commonStyles = + """ + + """ + +wrapWithTemplate :: String -> String -> String +wrapWithTemplate toc htmlContent = + """ + + + + + + Transity Documentation + + + + """ <> commonStyles + <> + """ + + +
+ """ + <> toc + <> + """ +
+ """ + <> htmlContent + <> + """ +
+
+ + + """ + +cleanUpName :: String -> String +cleanUpName str = + case + str + # replace (Pattern ".md") (Replacement "") + # split (Pattern "_") + of + [ _, rest ] -> rest + _ -> str + +getToc :: Array String -> String +getToc headings = + """ + + """ + +-- | Set the extension of a file path +-- | ```purs +-- | setExt ".html" "index.md" == "index.html" +-- | ``` +setExt :: String -> String -> String +setExt ext path = do + let + extension = extname path + basename = basenameWithoutExt path extension + basename <> ext + +buildDocs :: Aff Unit +buildDocs = do + let + srcDir = "docs_src" + targetDir = "docs/docs" + + files <- srcDir # readdir <#> sort + + liftEffect $ log "Log the files:" + + fileEntries <- for files \fileName -> do + mdContent <- readTextFile UTF8 $ concat [ srcDir, fileName ] + markdownIt <- liftEffect $ newMarkdownIt Default $ html := true + htmlContent <- liftEffect $ render markdownIt mdContent + pure $ { name: fileName, content: htmlContent } + + mkdir' targetDir { mode: permsReadWrite, recursive: true } + + -- Write each file's HTML content to a file + for_ fileEntries \fileEntry -> do + let + targetFile = fileEntry.name # toLower # setExt ".html" + toc = getToc + ( [ "index.md" ] <> -- Must be first in the list + ( files + # filter (\name -> name /= "index.md") + ) + ) + + liftEffect $ log $ "Writing file: " <> targetFile + writeTextFile UTF8 + (concat [ targetDir, targetFile ]) + (wrapWithTemplate toc fileEntry.content) + + copy "images" $ concat [ targetDir, "images" ] + + let hightlightJsDir = "node_modules/@highlightjs/cdn-assets" + copyFileTo targetDir $ concat [ hightlightJsDir, "highlight.min.js" ] + copyFileTo targetDir $ concat + [ hightlightJsDir, "styles/stackoverflow-light.min.css" ] + +copyFileTo :: String -> String -> Aff Unit +copyFileTo targetDir filePath = do + let targetPath = concat [ targetDir, basename filePath ] + remove targetPath + copyFile filePath targetPath + +main :: Effect Unit +main = launchAff_ do + buildDocs diff --git a/src/Transity/Utils.purs b/src/Transity/Utils.purs index fe07a54..a20b31a 100644 --- a/src/Transity/Utils.purs +++ b/src/Transity/Utils.purs @@ -1,26 +1,6 @@ module Transity.Utils where -import Prelude - ( class Eq - , bind - , discard - , map - , max - , pure - , show - , Unit - , (#) - , ($) - , (+) - , (-) - , (/=) - , (<#>) - , (<>) - , (==) - , (>=) - , (>>=) - , (>>>) - ) +import Transity.Data.Config import Ansi.Codes (Color(..)) import Ansi.Output (withGraphics, foreground) @@ -39,12 +19,15 @@ import Data.Nullable (Nullable, toMaybe) import Data.Rational (Rational, (%)) import Data.Result (Result(..), fromEither) import Data.String - ( indexOf + ( Pattern(..) + , Replacement(..) + , indexOf , length - , split , replaceAll - , Pattern(..) - , Replacement(..) + , split + , toUpper + , singleton + , uncons ) import Data.String.CodeUnits (toCharArray, fromCharArray) import Data.Time.Duration (Milliseconds(Milliseconds)) @@ -55,14 +38,19 @@ import Effect.Class.Console (error) import Foreign.Object (Object) import JS.BigInt (fromInt, fromString, pow) import Node.Process (setExitCode) - -import Transity.Data.Config +import Prelude (class Eq, bind, discard, map, max, pure, show, Unit, (#), ($), (+), (-), (/=), (<#>), (<>), (==), (>=), (>>=), (>>>)) -- | Flag to switch between different ways of sorting the output data SortOrder = CustomSort | Alphabetically derive instance eqSortOrder :: Eq SortOrder +-- | Capitalize the first `Char` in a `String` +capitalize :: String -> String +capitalize str = case uncons str of + Just o -> (toUpper $ singleton o.head) <> o.tail + _ -> str + foreign import parseToUnixTimeImpl :: String -> Nullable Number parseToUnixTime :: String -> Maybe Number diff --git a/webapp/index.html b/webapp/index.html index d20014a..06a6e72 100644 --- a/webapp/index.html +++ b/webapp/index.html @@ -9,7 +9,13 @@