METEOR / ESLINT
Moving to Meteor 3?
Find the synchronous calls first.
In January 2024, I shared Quave’s Meteor ESLint plugin with the community. We built rules for synchronous server calls and Fibers usage, so you can find these patterns in your editor or lint output instead of searching for each one by hand.
@quave/eslint-plugin-meteor-quave · MIT license
import { Meteor } from 'meteor/meteor'; Meteor.methods({ async currentUserName() { const user = Meteor.user(); return user?.username; },});THE CHANGE
Why add a lint rule for this?
Meteor 3 removed Fibers. On the server, calls such as Meteor.user() and Collection.findOne() need their async versions. Meteor’s migration guide lists the API changes, the plugin helps you locate specific uses in your code.
Look at line 5 in the example. The function is already async, but Meteor.user() is still synchronous. We change it to await Meteor.userAsync(), then read the returned document. Adding async to a function does not change the APIs it calls.
What about the rest of the app? If you make a synchronous function async, review its callers too, they now receive a Promise. A lint finding gives you a place to start, you still need to check the call chain and test the behavior.
THE RULES
Five checks for the migration
These are five migration-related rules, not the plugin’s entire rule set. Each link opens the current implementation on main.
- 01Read source
Synchronous MongoDB methods on the server
Looks for methods such as findOne, insert, update and remove, plus cursor operations such as fetch and count. The checks use names and call patterns, not full type information.
- 02Read source
Direct Fiber and Future usage
Detects imports from fibers, new Future(), Fiber() and specific helpers such as Future.wait and Fiber.yield.
- 03Read source
Promise helpers backed by Fibers
Flags Promise.await, Promise.awaitAll, Promise.async and Promise.asyncApply. It also flags .await on other objects, so check what the receiver actually is.
- 04Read source
Meteor.wrapAsync
Detects references to Meteor.wrapAsync, the callback wrapper backed by Fibers. Review the wrapped API and use its Promise API, or a Promise-based wrapper.
- 05Read source
Meteor.user() on the server
Flags Meteor.user() in files identified as server code. Use await Meteor.userAsync() when you need the user document, as shown above.
RUN IT IN YOUR APP
Install, configure, inspect.
The plugin README recommends Quave’s ESLint config, or you can install the plugin separately. Installing it alone does not enable the rules.
1. Install the package
npm i -D @quave/eslint-plugin-meteor-quave2. Enable the rules in your ESLint config
Follow the Quave config instructions or inspect the plugin’s recommended config when integrating it yourself. Those examples use legacy ESLint configuration. Check the package requirements and your ESLint version, do not paste a legacy config into a flat-config project unchanged.
3. Run without automatic fixes first
Quave’s sample lint script includes
--fix. Remove that flag for the first pass, read the findings and make the changes in small steps. Test the affected methods and their callers before moving on.
Stuck on a Meteor migration?
Send us your Meteor version, the package or call that is blocking you, and what you already tried. That gives us something concrete to discuss.


