Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Convert all MirageJS ids to integers

MirageJS provides all model ids as strings. Our backend uses integers, which are convenient for sorting and so on. After reading around MirageJS does not support integer IDs out of the box. From the conversations I've read the best solution would be to convert Ids in a serializer.

Output:

{
 id: "1",
 title: "Some title",
 otherValue: "Some other value"
}

But what I want is:

Expected Output:

{
 id: 1,
 title: "Some title",
 otherValue: "Some other value"
}

I really want to convert ALL ids. This would included nested objects, and serialized Ids.

like image 396
Francois Carstens Avatar asked Oct 27 '25 06:10

Francois Carstens


1 Answers

I think you should be able to use a custom IdentityManager for this. Here's a REPL example. (Note: REPL is a work in progress + currently only works on Chrome).

Here's the code:

import { Server, Model } from "miragejs";

class IntegerIDManager {
  constructor() {
    this.ids = new Set();
    this.nextId = 1;
  }

  // Returns a new unused unique identifier.
  fetch() {
    let id = this.nextId++;
    this.ids.add(id);

    return id;
  }

  // Registers an identifier as used. Must throw if identifier is already used.
  set(id) {
    if (this.ids.has(id)) {
      throw new Error('ID ' + id + 'has already been used.');
    }

    this.ids.add(id);
  }

  // Resets all used identifiers to unused.
  reset() {
    this.ids.clear();
  }
}

export default new Server({
  identityManagers: {
    application: IntegerIDManager,
  },

  models: {
    user: Model,
  },

  seeds(server) {
    server.createList("user", 3);
  },

  routes() {
    this.resource("user");
  },
});

When I make a GET request to /users with this server I get integer IDs back.

like image 107
Sam Selikoff Avatar answered Oct 29 '25 21:10

Sam Selikoff



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!