typstyle¶
A beautiful and reliable code formatter for Typst.
Installation and Usage¶
Use as a CLI¶
Installation¶
You can install typstyle
using any of the following methods:
- Download the binary from the release page.
- Install it from your package manager: https://repology.org/project/typstyle/versions.
- Install using
cargo-binstall
:
1 |
|
- Install it with
cargo
:
1 |
|
CLI Usage¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
Examples¶
- Format a file in place:
1 |
|
- Format a file and print the result to stdout:
1 |
|
- Format multiple files in place:
1 |
|
- Format all files in a directory. If the argument is not provided, it will recursively format all files in the current directory:
1 |
|
- Read from stdin and print the result to stdout:
1 |
|
Use in your editor¶
Typstyle has been integrated into tinymist. You can use it in your editor by installing the tinymist plugin and set tinymist.formatterMode
to typstyle
.
Use as a web app¶
Try the online version of the formatter at: https://enter-tainer.github.io/typstyle/demo/. You can see how it formats your code.
Use with pre-commit¶
Add this to your .pre-commit-config.yaml
:
1 2 3 4 |
|
Use as a Library¶
Features & Design¶
Design Goals¶
- Opinionated: We want to have a consistent style across all codebases.
- Code only: We want to format only the code. Contents should be left untouched as much as possible.
- Convergence: Running the formatter twice should not change the code.
- Correctness: The formatter should not change the looking of the rendered output.
Escape Hatch¶
If you find typstyle is not working as expected, you can use // @typstyle off
or /* @typstyle off */
to disable the formatter on the next node of code.
Typstyle also gives up formatting part of the code if it is not able to format it correctly. Specifically, it will print that part as is if:
- contains syntax error
- contains syntaxes that are not supported by the formatter
And please let us know the issue by creating an issue on the GitHub repository
Known Issues¶
You tell us! Bad formatting? Incorrect output? Please create an issue on the GitHub repository!
We've set up comprehensive test suites to ensure the correctness of the formatter. If you find any issues, please let us know! And we can add more tests to prevent the issue from happening again.
Roadmap¶
See the tracking issue.
Documentation¶
See https://enter-tainer.github.io/typstyle/.
Testing¶
We maintain a comprehensive suite of tests to ensure the correctness and reliability of typstyle.
Types of Tests¶
- Convergence tests: Format result must be the same when applied twice.
- Snapshot tests: Format result are stored in the
snapshots
directory and are compared to the current result when running the tests. - Correctness test: We compare the rendered output of the code before and after formatting and ensure they are the same.
- E2E Correctness test: We collect a bunch of typst code repo including
tablex
,cetz
,fletcher
... and format them to ensure: (a) the format result converges, and (b) the rendered output is the same. - CLI tests: We ensure that the CLI arguments can correctly control the behavior of the program, and the output is desirable.
Running Tests¶
For developers, you need to install cargo-nextest and cargo-insta to run tests.
- List all tests:
1 |
|
- Run all tests and review snapshots:
1 2 |
|
- Run snapshot tests only:
1 2 |
|
- Run tests excluding end-to-end (e2e):
1 |
|
- Run tests for CLI:
1 |
|
Benchmark¶
We provide benchmarks for node attribute computation and pretty printing. Typically, it can format a large document (given parsed source) within 5ms (e.g., tablex.typ
with ~3000 lines).
We also have continuous benchmarking for each commit on master
branch. See https://enter-tainer.github.io/typstyle-bench-results/dev/bench/.
Running benches¶
- List benchmarks:
1 |
|
- Run benchmarks:
1 |
|
The benchmark results is generated by criterion.rs. You can check target/criterion/report
to see the reports.
Why Another Formatter?¶
Why there is a need for another formatter? We already have typstfmt, typstfmt, prettypst. Why another one?
Typstyle started because I had a bunch of ideas on how to improve typst source code formatting but kept finding typstfmt wasn't a good codebase to explore them with. Namely:
- I wanted to use Wadler's pretty printer (implemented by pretty.rs) to get consistent and beautiful output for any width. (Note that it is the same technique used in the prettier formatter)
- I didn't have much energy to maintain a bunch combination of configuration options. It turns out to be very hard to make everything correct. So I decided to make it opinionated.
- I wanted to experiment with more testing techniques and make sure the formatter is correct.
So I decided to write something from scratch. I started it about half a year ago and kept working on it in my spare time. Currently it lacks some advanced features but it is already usable for most of the cases. I hope you like it!