✨ We're hiring!
Quave Logo

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

server/main.jsSERVER
import { Meteor } from 'meteor/meteor'; Meteor.methods({  async currentUserName() {    const user = Meteor.user();    return user?.username;  },});
Meteor.user() on the server should be replaced by Meteor.userAsync()no-sync-user-methods-on-server · line 5
Illustrative example, not a live ESLint run. Compare the rule tests with Meteor’s userAsync migration example.

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.

  1. 01

    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.

    Read source
  2. 02

    Direct Fiber and Future usage

    Detects imports from fibers, new Future(), Fiber() and specific helpers such as Future.wait and Fiber.yield.

    Read source
  3. 03

    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.

    Read source
  4. 04

    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.

    Read source
  5. 05

    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.

    Read source

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. 1. Install the package

    npm i -D @quave/eslint-plugin-meteor-quave
  2. 2. 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. 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.

© 2026 Quave. All rights reserved.