- main linting is now done by oxlint. eslint remains for linting json
files in the frontend (until oxlint adds support)
- move type checking to the lint step (with --type-check)
this improves performance by removing a duplicated typescript parse task
(instead of parsing for linting then again for type checking, it parses
once for both)
- add a `lint-fast` npm script to get some fast fail behavior. it simply
lints with no type information
- oxc plugins are still in preview, so the custom plugin that checks for
`__testing` usage outside of tests runs outside the main linting job
until performance is improved
- fixes some type issues (and config issues) that were not visible due
to a missing type check on some files. now type checking will run on
every file that is linted
- split up oxc config for easier management
waiting https://github.com/oxc-project/tsgolint/pull/494
seeing around 3x improvement in type aware linting
### Description
<!-- Please describe the change(s) made in your PR -->
### Checks
- [ ] Adding/modifying Typescript code?
- [ ] I have used `qs`,`qsa` or `qsr` instead of JQuery selectors.
- [ ] Adding quotes?
- [ ] Make sure to include translations for the quotes in the
description (or another comment) so we can verify their content.
- [ ] Adding a language?
- Make sure to follow the [languages
documentation](https://github.com/monkeytypegame/monkeytype/blob/master/docs/LANGUAGES.md)
- [ ] Add language to `packages/schemas/src/languages.ts`
- [ ] Add language to exactly one group in
`frontend/src/ts/constants/languages.ts`
- [ ] Add language json file to `frontend/static/languages`
- [x] Adding a theme?
- Make sure to follow the [themes
documentation](https://github.com/monkeytypegame/monkeytype/blob/master/docs/THEMES.md)
- [x] Add theme to `packages/schemas/src/themes.ts`
- [x] Add theme to `frontend/src/ts/constants/themes.ts`
- [x] Add theme css file to `frontend/static/themes`
- [x] Add some screenshot of the theme, especially with different test
settings (colorful, flip colors) to your pull request
- [ ] Adding a layout?
- [ ] Make sure to follow the [layouts
documentation](https://github.com/monkeytypegame/monkeytype/blob/master/docs/LAYOUTS.md)
- [ ] Add layout to `packages/schemas/src/layouts.ts`
- [ ] Add layout json file to `frontend/static/layouts`
- [ ] Adding a font?
- Make sure to follow the [themes
documentation](https://github.com/monkeytypegame/monkeytype/blob/master/docs/FONTS.md)
- [ ] Add font file to `frontend/static/webfonts`
- [ ] Add font to `packages/schemas/src/fonts.ts`
- [ ] Add font to `frontend/src/ts/constants/fonts.ts`
- [ ] Check if any open issues are related to this PR; if so, be sure to
tag them below.
- [x] Make sure the PR title follows the Conventional Commits standard.
(https://www.conventionalcommits.org for more info)
- [x] Make sure to include your GitHub username prefixed with @ inside
parentheses at the end of the PR title.
<!-- label(optional scope): pull request title (@your_github_username)
-->
<!-- I know I know they seem boring but please do them, they help us and
you will find out it also helps you.-->
Closes #
Theme Screenshots :
<img width="1484" height="766" alt="2025-12-14_23-51-42"
src="https://github.com/user-attachments/assets/94d9d9dd-37b9-42f0-8930-b75aeb35c913"
/>
<img width="1484" height="766" alt="2025-12-14_23-53-11"
src="https://github.com/user-attachments/assets/995532d3-b6dc-4f19-b9a1-4b8704d8330b"
/>
<!-- the issue(s) your PR resolves if any (delete if that is not the
case) -->
<!-- please also reference any issues and or PRs related to your pull
request -->
<!-- Also remove it if you are not following any issues. -->
<!-- pro tip: you can mention an issue, PR, or discussion on GitHub by
referencing its hash number e.g:
[#1234](https://github.com/monkeytypegame/monkeytype/pull/1234) -->
<!-- pro tip: you can press . (dot or period) in the code tab of any
GitHub repo to get access to GitHub's VS Code web editor Enjoy! :) -->
Co-authored-by: Asif Malik <aasifmalik22789@gmail.com>
Co-authored-by: Christian Fehmer <fehmer@users.noreply.github.com>
### Description
Adds a tribeEnabled feature flag to gate tribe multiplayer
functionality.
# Note
Once this PR is approved and merged into `newtribemerge`,
`newtribemerge` can safely be merged into `master`
---------
Co-authored-by: Miodec <jack@monkeytype.com>
### Description
Check if the user bailed out mid word, if so decrease `historyLength` by
1 to reset to the start of the current word instead of the start of the
next word.
### Description
Also modifies `swapElements` to accept `ElementWithUtils`.
---------
Co-authored-by: Christian Fehmer <fehmer@users.noreply.github.com>
Co-authored-by: Christian Fehmer <cfe@sexy-developer.com>
### Description
* `update()` could hit a race where settings became `null` between
checks, causing a`TypeError` at runtime.
* Async callbacks (setTimeout) accessed the global settings after it was
cleared, leading to runaway errors.
<img width="1887" height="755" alt="Screenshot 2025-12-12 135316"
src="https://github.com/user-attachments/assets/ba6bd13c-c052-4870-ba7c-cfeae916b6dc"
/>
**fix**
settings once (currentSettings) at the start of update() and use that
for all property access and scheduling, so the loop never touches a
null/stale reference.
Move ui code to test ui, remove unused code, remove duplicated code,
merge the two config event listeners, merge a lot of the ui code to make
it easier to grasp.
### Description
In the current implementation, the time difference between `now` and
when we call `TestTimer.clear()` is high enough, so that if the test
duration is really close to a whole number (say `3.96`), then
`TestTimer` will continue to run up until the whole number, and will
push another wpm entry to `wpmHistory` and another raw entry to
`rawHistory`, causing the result chart to be messed up. This
implementation clears `TestTimer` right after calculating `now` to
hopefully allow for a smaller time difference between `now` and
`TestTimer`.
Also fixed some typos in comments.
Sanitize throws error if an object contains an array with 1) an invalid
value and 2) too few items. The list of problems contains the path to
the array twice and tries to remove the invalid element from the already
deleted array.
Config object:
```json
"customPolyglot": [
"japanese"
]
```