A Simple JSON Backed Database in Typescript

07 July 2022

Define the database

The database is defined as a class which has an in-memory store data and a persist method that allows for persisting the database to a file as well as content when an instance is created from an existing JSON file

The code for the database can be seen below:

import { existsSync, readFileSync, writeFileSync } from "fs";

export class Database<TData> {
  public data: TData;

  constructor(private readonly dbPath: string, initial: TData) {
    this.data = this.load(initial);
  }

  public update = (data: Partial<TData>) => this.data = {...this.data, ...data}

  public commit = () => this.persist(this.data);

  private persist = (data: TData) =>
    writeFileSync(this.dbPath, JSON.stringify(data));

  private read = (): TData =>
    JSON.parse(readFileSync(this.dbPath).toString()) as TData;

  private load = (initial: TData): TData => {
    if (!existsSync(this.dbPath)) {
      this.persist(initial);
    }

    const current = this.read();

    return {
      ...initial,
      ...current,
    };
  };
}

Usage

The database can be used by creating an instance and modifying the data in it by using the update method, and can be written to a file using the commit method:

import {Database}from './db'

interface User {
  name: string;
  age: number;
}

interface DB {
  users: User[]
}

const initial: DB = {
  users: []
}

const db = new Database<DB>('./data.json', initial)

db.update({
  users: [{
    name: 'Test',
    age: 20,
  }]
})

db.commit()

Functional Example

The above code is found in the below REPL as a runnable example: