File: README.md
XState is a state management and orchestration solution for JavaScript and TypeScript apps. It has zero dependencies, and is useful for frontend and backend application logic.
It uses event-driven programming, state machines, statecharts, and the actor model to handle complex logic in predictable, robust, and visual ways. XState provides a powerful and flexible way to manage application and workflow state by allowing developers to model logic as actors and state machines.
β¨ Create state machines visually in Stately Studio β [state.new](https://state.new)
β‘οΈ Create state machines with the Stately Editor
π₯ Download our VS Code extension
π Inspired by the SCXML specification
π¬ Chat on the Stately Discord Community
βοΈ Browse through the many XState examples
Which package should I use?
Pick based on what you need:
@xstate/store: simple event-based state management and reactive atoms, with great TypeScript inference, similar in spirit to Redux/Zustand. Start here if you just need a store.xstate: state machines, statecharts, actors, effects, and orchestration for complex app logic.
They work great together, but you don't need one to use the other.
Sponsors
Special thanks to the sponsors who support this open-source project:
Templates
Get started by forking one of these templates on CodeSandbox:
| Template | |
|---|---|
| π€ XState Template (CodeSandbox) |
- TypeScript
- No framework |
| βοΈ XState + React Template (CodeSandbox)
| - React
- XState v5
- TypeScript |
| π XState + Vue Template (CodeSandbox)
| - Vue
- XState v5
- TypeScript |
| π§‘ XState + Svelte Template (CodeSandbox)
| - Svelte
- XState v5
- TypeScript |
Super quick start
npm install xstateimport { createMachine, createActor, assign } from 'xstate';
// State machine
const toggleMachine = createMachine({
id: 'toggle',
initial: 'inactive',
context: {
count: 0
},
states: {
inactive: {
on: {
TOGGLE: { target: 'active' }
}
},
active: {
entry: assign({ count: ({ context }) => context.count + 1 }),
on: {
TOGGLE: { target: 'inactive' }
}
}
}
});
// Actor (instance of the machine logic, like a store)
const toggleActor = createActor(toggleMachine);
toggleActor.subscribe((state) => console.log(state.value, state.context));
toggleActor.start();
// => logs 'inactive', { count: 0 }
toggleActor.send({ type: 'TOGGLE' });
// => logs 'active', { count: 1 }
toggleActor.send({ type: 'TOGGLE' });
// => logs 'inactive', { count: 1 }`@xstate/store`: simple state management
Not every app needs all the features of state machines and statecharts. @xstate/store is a separate, extremely small event-based store with first-class TypeScript inference; similar to Redux or Zustand, but with less boilerplate.
Use it on its own, or graduate to full XState machines when your logic gets more complex.
npm install @xstate/storeimport { createStore } from '@xstate/store';
const donutStore = createStore({
context: {
donuts: 0,
favoriteFlavor: 'chocolate'
},
on: {
addDonut: (context) => ({ ...context, donuts: context.donuts + 1 }),
changeFlavor: (context, event: { flavor: string }) => ({
...context,
favoriteFlavor: event.flavor
}),
eatAllDonuts: (context) => ({ ...context, donuts: 0 })
}
});
donutStore.subscribe((snapshot) => {
console.log(snapshot.context);
});
donutStore.send({ type: 'addDonut' });
// => { donuts: 1, favoriteFlavor: 'chocolate' }
donutStore.send({ type: 'changeFlavor', flavor: 'strawberry' });
// => { donuts: 1, favoriteFlavor: 'strawberry' }π See the @xstate/store README for React/Solid bindings, selectors, and more.
[Stately Studio](https://stately.ai)
- Visually create, edit, and collaborate on state machines
- Export to many formats, including XState v5
- Test path & documentation autogeneration
- Deploy to Stately Sky
- Generate & modify machines with Stately AI
Why?
Statecharts are a formalism for modeling stateful, reactive systems. This is useful for declaratively describing the behavior of your application, from the individual components to the overall application logic.
Read π½ the slides (π₯ video) or check out these resources for learning about the importance of finite state machines and statecharts in user interfaces:
- Statecharts - A Visual Formalism for Complex Systems by David Harel
- The World of Statecharts by Erik Mogensen
Packages
| Package | Description |
|---|---|
π€ xstate |
Core finite state machine and statecharts library + interpreter, including graph traversal and model-based testing utilities |
πͺ @xstate/store |
Simple event-based state management and reactive atoms β standalone, works with or without xstate |
βοΈ @xstate/react |
React hooks and utilities for using XState in React applications |
π @xstate/vue |
Vue composition functions and utilities for using XState in Vue applications |
π· @xstate/svelte |
Svelte utilities for using XState in Svelte applications |
π₯ @xstate/solid |
Solid hooks and utilities for using XState in Solid applications |
π @statelyai/inspect |
Inspection utilities for XState |
Finite State Machines
| Code | Statechart |
|---|
Hierarchical (Nested) State Machines
| Code | Statechart |
|---|---|
| ```js | |
| import { createMachine, createActor } from 'xstate'; |
const pedestrianStates = {
initial: 'walk',
states: {
walk: {
on: {
PED_TIMER: 'wait'
}
},
wait: {
on: {
PED_TIMER: 'stop'
}
},
stop: {}
}
};
const lightMachine = createMachine({
id: 'light',
initial: 'green',
states: {
green: {
on: {
TIMER: 'yellow'
}
},
yellow: {
on: {
TIMER: 'red'
}
},
red: {
on: {
TIMER: 'green'
},
...pedestrianStates
}
}
});
const actor = createActor(lightMachine);
actor.subscribe((state) => {
console.log(state.value);
});
actor.start();
// logs 'green'
actor.send({ type: 'TIMER' });
// logs 'yellow'
actor.send({ type: 'TIMER' });
// logs { red: 'walk' }
actor.send({ type: 'PED_TIMER' });
// logs { red: 'wait' }
## Parallel State Machines
| Code | Statechart |
| --- | --- |
| ```ts
import { createMachine, createActor } from 'xstate';
const wordMachine = createMachine({
id: 'word',
type: 'parallel',
states: {
bold: {
initial: 'off',
states: {
on: {
on: { TOGGLE_BOLD: 'off' }
},
off: {
on: { TOGGLE_BOLD: 'on' }
}
}
},
underline: {
initial: 'off',
states: {
on: {
on: { TOGGLE_UNDERLINE: 'off' }
},
off: {
on: { TOGGLE_UNDERLINE: 'on' }
}
}
},
italics: {
initial: 'off',
states: {
on: {
on: { TOGGLE_ITALICS: 'off' }
},
off: {
on: { TOGGLE_ITALICS: 'on' }
}
}
},
list: {
initial: 'none',
states: {
none: {
on: {
BULLETS: 'bullets',
NUMBERS: 'numbers'
}
},
bullets: {
on: {
NONE: 'none',
NUMBERS: 'numbers'
}
},
numbers: {
on: {
BULLETS: 'bullets',
NONE: 'none'
}
}
}
}
}
});
const actor = createActor(wordMachine);
actor.subscribe((state) => {
console.log(state.value);
});
actor.start();
// logs {
// bold: 'off',
// italics: 'off',
// underline: 'off',
// list: 'none'
// }
actor.send({ type: 'TOGGLE_BOLD' });
// logs {
// bold: 'on',
// italics: 'off',
// underline: 'off',
// list: 'none'
// }
actor.send({ type: 'TOGGLE_ITALICS' });
// logs {
// bold: 'on',
// italics: 'on',
// underline: 'off',
// list: 'none'
// }
``` | Open in Stately Studio |
## History States
| Code | Statechart |
| --- | --- |
| ```js
import { createMachine, createActor } from 'xstate';
const paymentMachine = createMachine({
id: 'payment',
initial: 'method',
states: {
method: {
initial: 'cash',
states: {
cash: {
on: {
SWITCH_CHECK: 'check'
}
},
check: {
on: {
SWITCH_CASH: 'cash'
}
},
hist: { type: 'history' }
},
on: { NEXT: 'review' }
},
review: {
on: { PREVIOUS: 'method.hist' }
}
}
});
const actor = createActor(paymentMachine);
actor.subscribe((state) => {
console.log(state.value);
});
actor.start();
// logs {
// value: { method: 'cash' },
// }
actor.send({ type: 'SWITCH_CHECK' });
// logs {
// value: { method: 'check' },
// }
actor.send({ type: 'NEXT' });
// logs {
// value: 'review',
// }
actor.send({ type: 'PREVIOUS' });
// logs {
// value: { method: 'check' },
// }
``` | Open in Stately Studio |
## SemVer Policy
We understand the importance of the public contract and do not intend to release any breaking changes to the **runtime** API in a minor or patch release. We consider this with any changes we make to the XState libraries and aim to minimize their effects on existing users.
### Breaking changes
XState executes much of the user logic itself. Therefore, almost any change to its behavior might be considered a breaking change. We recognize this as a potential problem but believe that treating every change as a breaking change is not practical. We do our best to implement new features thoughtfully to enable our users to implement their logic in a better, safer way.
Any change _could_ affect how existing XState machines behave if those machines are using particular configurations. We do not introduce behavior changes on a whim and aim to avoid making changes that affect most existing machines. But we reserve the right to make _some_ behavior changes in minor releases. Our best judgment of the situation will always dictate such changes. Please always read our release notes before deciding to upgrade.
### TypeScript changes
We also reserve a similar right to adjust declared TypeScript definitions or drop support for older versions of TypeScript in a minor release. The TypeScript language itself evolves quickly and often introduces breaking changes in its minor releases. Our team is also continuously learning how to leverage TypeScript more effectively - and the types improve as a result.
For these reasons, it is impractical for our team to be bound by decisions taken when an older version of TypeScript was its latest version or when we didnβt know how to declare our types in a better way. We wonβt introduce declaration changes often - but we are more likely to do so than with runtime changes.
### Packages
Most of the packages in the XState family declare a peer dependency on XState itself. Weβll be cautious about maintaining compatibility with already-released packages when releasing a new version of XState, **but** each release of packages depending on XState will always adjust the declared peer dependency range to include the latest version of XState. For example, you should always be able to update `xstate` without `@xstate/react`. But when you update `@xstate/react`, we highly recommend updating `xstate` too.
---
## File: AGENTS.md
This is a monorepo containing XState, @xstate/store, and related packages.
## Dev environment
- Use pnpm to install dependencies
## PR instructions
- Run `pnpm test` to run the tests in all packages, only for changes that affect mulitple packages.
- Run `pnpm test:core` to only run core XState tests.
- Run `pnpm test:store` to only run @xstate/store tests.
- Run `pnpm lint` and `pnpm format:check` to check linting and formatting.
- Run `pnpm typecheck` to make sure that there are no type errors.
- Before making a PR, run `pnpm changeset` to create a changeset with a short description of the changes, and a code example if applicable. Do not include implementation details; only pertinent details for developers using the package.
---
## File: CODE_OF_CONDUCT.md
# Contributor Covenant Code of Conduct
## Our Pledge
We as members, contributors, and leaders pledge to make participation in our
community a harassment-free experience for everyone, regardless of age, body
size, visible or invisible disability, ethnicity, sex characteristics, gender
identity and expression, level of experience, education, socio-economic status,
nationality, personal appearance, race, caste, color, religion, or sexual
identity and orientation.
We pledge to act and interact in ways that contribute to an open, welcoming,
diverse, inclusive, and healthy community.
## Our Standards
Examples of behavior that contributes to a positive environment for our
community include:
- Demonstrating empathy and kindness toward other people
- Being respectful of differing opinions, viewpoints, and experiences
- Giving and gracefully accepting constructive feedback
- Accepting responsibility and apologizing to those affected by our mistakes,
and learning from the experience
- Focusing on what is best not just for us as individuals, but for the overall
community
Examples of unacceptable behavior include:
- The use of sexualized language or imagery, and sexual attention or advances of
any kind
- Trolling, insulting or derogatory comments, and personal or political attacks
- Public or private harassment
- Publishing others' private information, such as a physical or email address,
without their explicit permission
- Other conduct which could reasonably be considered inappropriate in a
professional setting
## Enforcement Responsibilities
Community leaders are responsible for clarifying and enforcing our standards of
acceptable behavior and will take appropriate and fair corrective action in
response to any behavior that they deem inappropriate, threatening, offensive,
or harmful.
Community leaders have the right and responsibility to remove, edit, or reject
comments, commits, code, wiki edits, issues, and other contributions that are
not aligned to this Code of Conduct, and will communicate reasons for moderation
decisions when appropriate.
## Scope
This Code of Conduct applies within all community spaces, and also applies when
an individual is officially representing the community in public spaces.
Examples of representing our community include using an official e-mail address,
posting via an official social media account, or acting as an appointed
representative at an online or offline event.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported to the community leaders responsible for enforcement at **[email protected]**.
All complaints will be reviewed and investigated promptly and fairly.
All community leaders are obligated to respect the privacy and security of the
reporter of any incident.
## Enforcement Guidelines
Community leaders will follow these Community Impact Guidelines in determining
the consequences for any action they deem in violation of this Code of Conduct:
### 1. Correction
**Community Impact**: Use of inappropriate language or other behavior deemed
unprofessional or unwelcome in the community.
**Consequence**: A private, written warning from community leaders, providing
clarity around the nature of the violation and an explanation of why the
behavior was inappropriate. A public apology may be requested.
### 2. Warning
**Community Impact**: A violation through a single incident or series of
actions.
**Consequence**: A warning with consequences for continued behavior. No
interaction with the people involved, including unsolicited interaction with
those enforcing the Code of Conduct, for a specified period of time. This
includes avoiding interactions in community spaces as well as external channels
like social media. Violating these terms may lead to a temporary or permanent
ban.
### 3. Temporary Ban
**Community Impact**: A serious violation of community standards, including
sustained inappropriate behavior.
**Consequence**: A temporary ban from any sort of interaction or public
communication with the community for a specified period of time. No public or
private interaction with the people involved, including unsolicited interaction
with those enforcing the Code of Conduct, is allowed during this period.
Violating these terms may lead to a permanent ban.
### 4. Permanent Ban
**Community Impact**: Demonstrating a pattern of violation of community
standards, including sustained inappropriate behavior, harassment of an
individual, or aggression toward or disparagement of classes of individuals.
**Consequence**: A permanent ban from any sort of public interaction within the
community.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
version 2.1, available at
[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1].
Community Impact Guidelines were inspired by
[Mozilla's code of conduct enforcement ladder][mozilla coc].
For answers to common questions about this code of conduct, see the FAQ at
[https://www.contributor-covenant.org/faq][faq]. Translations are available at
[https://www.contributor-covenant.org/translations][translations].
[homepage]: https://www.contributor-covenant.org
[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html
[mozilla coc]: https://github.com/mozilla/diversity
[faq]: https://www.contributor-covenant.org/faq
[translations]: https://www.contributor-covenant.org/translations
---
## File: CONTRIBUTING.md
# Contributing
Thank you for your interest in contributing to XState! Contributors like you make this project possible, and we welcome any contributions to the code base and the documentation.
There are several ways you can contribute to XState:
- π₯ [Submit an issue](#submit-an-issue)
- β¨ [Solve an issue or make a change](#making-changes)
- ποΈ [Write documentation](https://github.com/statelyai/docs)
- π¬ [Respond to support questions in the GitHub discussions](https://github.com/statelyai/xstate/discussions)
- π [Respond to questions in the Help channel on Discord](https://discord.gg/xstate)
Please read [our code of conduct](https://github.com/statelyai/xstate/blob/main/CODE_OF_CONDUCT.md).
## Environment
- Use Node 24.16.0.
- Enable Corepack and run `pnpm install`. The repository pins pnpm 10.34.5.
## Making changes
Pull requests are encouraged. If you want to add a feature or fix a bug:
1. [Fork](https://docs.github.com/en/github/getting-started-with-github/fork-a-repo) and [clone](https://docs.github.com/en/github/creating-cloning-and-archiving-repositories/cloning-a-repository) the [repository](https://github.com/statelyai/xstate).
1. [Create a separate branch](https://docs.github.com/en/desktop/contributing-and-collaborating-using-github-desktop/managing-branches) for your changes.
1. Make your changes, and write tests that validate your change and/or fix.
1. Run `pnpm test` (for all packages) or `pnpm test:core` (for only changes to core XState).
1. Run `pnpm lint` and `pnpm format:check`.
1. Run `pnpm typecheck` to make sure that there are no type errors.
1. Create a changeset by running `pnpm changeset`. [More about changesets](https://github.com/atlassian/changesets).
1. Push your branch and open a PR π
PRs are reviewed promptly and merged in within a day or two (or even within an hour) if everything looks good.
## Contributing an example
Our [examples](https://github.com/statelyai/xstate/tree/main/examples) are self-contained apps that show how to solve a common problem, integrate another framework (like Vue or Svelte) or build something fun with XState.
To contribute an example, please read the [`readme`](https://github.com/statelyai/xstate/blob/main/examples/readme.md) in the `/examples` folder.
## Submit an issue
Issues and bug reports are also encouraged. If you want to submit an issue:
1. Search [existing issues](https://github.com/statelyai/xstate/issues) to check if your issue already exists or has been solved.
2. [Create a new issue](https://github.com/statelyai/xstate/issues/new/choose) if your issue has not yet been submitted.
3. Ensure you fill out all the details in the issue template to help us understand the issue.
Weβll try to respond promptly and address your issue as soon as possible.
## Contributing to our docs
Our [new docs](https://stately.ai/docs) are now in their own [docs repo](https://github.com/statelyai/docs). [Read the contribution guide for our Stately Studio and XState docs](https://github.com/statelyai/docs/blob/main/CONTRIBUTING.md).
### Legacy docs and xstate.js.org
The docs at `/docs` in this repo are legacy XState docs. They are built using [Vuepress](https://vuepress.vuejs.org) and deployed to [xstate.js.org/docs](https://xstate.js.org/docs) using GitHub pages from the `gh-pages` branch using the `pages build and deployment` workflow.
The [xstate.js.org](https://xstate.js.org) landing page is currently stored at `index.html` and deployed from the `gh-pages` branch using the `pages build and deployment` workflow.
## Setup
### Building
We are using [preconstruct](https://preconstruct.tools/) to build our packages. It comes with a handy trick which allows us to always use source files of packages contained in this monorepo. It creates hook/redirecting files in place of dist files during development. This always happens after installing packages (during `postinstall` step) and you shouldn't be worried about it, but if you actually build packages you destroy those redirecting files and to run tests, typechecking etc correctly you need to bring them back by running `pnpm postinstall`.
### Publishing
We are using [changesets](https://github.com/atlassian/changesets) to create "release intents" for our packages. When those pop up on master a release PR gets prepared automatically and once it gets merged actual release happen (also automatically).
---
## File: ISSUE_TEMPLATE.md
## Bug or feature request?
## (Bug) Expected result:
## (Bug) Actual result:
## (Bug) Potential fix:
**Required!** If you found a bug and can consistently reproduce it, please take a minute to think about what the potential fix might be.
Even if the fix is incorrect, this can help diagnose and find the solution to the issue as quickly as possible.
I also strongly encourage you to [create a pull request](https://github.com/statelyai/xstate/pulls) if you are confident in the potential fix.
## (Feature) Potential implementation:
**Required!** If you would like to see a feature or enhancement make its way to xstate, please describe:
- Confirm the idea is [not already on our Roadmap](https://github.com/statelyai/xstate/discussions/742).
- What the API would look like
- If this is a breaking change
- If this is part of the existing [SCXML specification](https://www.w3.org/TR/scxml/)
## Link to reproduction or proof-of-concept:
You can use [CodePen](https://codepen.io) or [CodeSandbox template](https://codesandbox.io/s/6dsws) to create a reproduction/POC.
---
## File: migration.md
# XState Version 3.x to 4 Migration Guide
## State Node Types
State nodes now have a `type: ...` property that defines the type of the node. There's 5 types:
- `type: 'parallel'` (required) for parallel state nodes
- `type: 'history'` (required) for history state nodes
- `type: 'final'` (required) for final state nodes
- `type: 'compound'` (optional) for compound/nested state nodes
- `type: 'atomic'` (optional) for atomic state nodes
Only `'parallel'`, `'history'`, and `'final'` are required for those state nodes. This replaces previous syntax:
```diff
- parallel: true,
+ type: 'parallel'
- history: true,
+ type: 'history',
+ history: 'deep', // 'shallow' by defaultMachine Configuration
IDs are recommended on the root state node (machine):
const machine = createMachine({
id: 'light', // add this property!
initial: 'green',
states: {/* ... */}
});This may become a strict-mode requirement in future versions.
States Configuration
The single nested object syntax will no longer work:
const machine = createMachine({
// ...
states: {
green: {
on: {
TIMER: {
// β οΈ deprecated in v4
yellow: { actions: ['doSomething'] }
}
}
}
}
});You now specify the transition as an object (or an array of objects) instead:
const machine = createMachine({
// ...
states: {
green: {
on: {
// β
will work in v4
TIMER: {
target: 'yellow',
actions: 'doSomething' // notice: array not necessary anymore!
}
}
}
}
});Of course, string targets still work as expected:
const machine = createMachine({
// ...
states: {
green: {
on: {
// β
still works in v4
TIMER: 'yellow'
}
}
}
});Optional Arrays
For developer convenience, every property that expects one or more entries now optionally takes an array:
{
// This still works
onEntry: ['someEntryAction'],
onExit: [{ type: 'someExitAction' }],
// But you can do this instead, if you prefer:
onEntry: 'someEntryAction',
onExit: { type: 'someExitAction' }
}That's about it!
File: package.json
{
"name": "xstate-monorepo",
"private": true,
"description": "Finite State Machines and Statecharts for the Modern Web.",
"workspaces": {
"packages": [
"packages/",
"scripts/"
]
},
"preconstruct": {
"packages": [
"packages/!(xstate-dev)"
],
"globals": {
"react": "React"
},
"exports": {
"importConditionDefaultExport": "default"
},
"___experimentalFlags_WILL_CHANGE_IN_PATCH": {
"importsConditions": true,
"typeModule": true,
"distInRoot": true
}
},
"scripts": {
"preinstall": "node ./scripts/ensure-pnpm.js",
"postinstall": "manypkg check && preconstruct dev",
"build": "preconstruct build",
"update:examples": "pnpm update:examples:deps && pnpm update:examples:links",
"update:examples:deps": "node ./scripts/update-example-deps.js",
"update:examples:links": "node ./scripts/update-example-links.js",
"fix": "manypkg fix",
"format": "oxfmt --write .",
"format:check": "oxfmt --check .",
"lint": "oxlint --quiet --report-unused-disable-directives-severity=error",
"lint:fix": "oxlint --fix --report-unused-disable-directives-severity=error",
"typecheck": "tsc",
"test": "vitest run",
"test:watch": "vitest",
"test:core": "vitest run --project xstate",
"test:core:watch": "vitest --project xstate",
"test:store": "vitest run --project @xstate/store*",
"test:store:watch": "vitest --project @xstate/store*",
"changeset": "changeset",
"release": "changeset publish",
"version": "changeset version"
},
"repository": {
"type": "git",
"url": "git+https://github.com/statelyai/xstate.git"
},
"author": "David Khourshid [email protected]",
"license": "MIT",
"bugs": {
"url": "https://github.com/statelyai/xstate/issues"
},
"homepage": "https://github.com/statelyai/xstate#readme",
"dependencies": {
"@babel/core": "^7.29.7",
"@babel/plugin-proposal-class-properties": "^7.18.6",
"@babel/preset-env": "^7.29.7",
"@babel/preset-react": "^7.29.7",
"@babel/preset-typescript": "^7.29.7",
"@changesets/changelog-github": "^1.0.0",
"@changesets/cli": "^3.0.0",
"@manypkg/cli": "^0.21.4",
"@preconstruct/cli": "^2.8.13",
"@types/node": "25.2.1",
"@typescript/native": "npm:typescript@^7.0.2",
"babel-preset-solid": "^1.9.12",
"eslint-plugin-jsdoc": "^63.3.2",
"happy-dom": "^17.6.3",
"husky": "^3.1.0",
"knip": "^5.88.1",
"lint-staged": "^16.4.0",
"oxfmt": "^0.61.0",
"oxlint": "^1.76.0",
"oxlint-tsgolint": "^7.0.2001",
"synckit": "^0.8.8",
"typescript": "npm:@typescript/typescript6@^6.0.2",
"vitest": "^3.2.7"
},
"husky": {
"hooks": {
"pre-commit": "lint-staged"
}
},
"lint-staged": {
"!(CLAUDE).{ts,tsx,mts,cts,js,jsx,mjs,cjs,json,jsonc,json5,md,mdx,css,scss,less,yml,yaml,html}": "oxfmt --write"
},
"pnpm": {
"onlyBuiltDependencies": [
"@parcel/watcher",
"esbuild",
"husky",
"lmdb",
"msgpackr-extract",
"svelte-preprocess",
"vue-demi"
],
"overrides": {
"@types/node": "25.2.1",
"stylus": "0.55.0",
"vite": "5.4.21"
},
"patchedDependencies": {
"@vue/[email protected]": "patches/@[email protected]"
}
},
"packageManager": "[email protected]+sha512.a4ee05f2f73658255bd6a89859c065a45c28a57daefae2c893a168ee2b73168c37b91e83e57ea67654ad03f03031746430e8bce38e362e042605fb8abc80192e"
}