react-indexeddb-kit
Version:
A TypeScript-based React IndexedDB wrapper with CRUD operations.
91 lines (90 loc) • 3.59 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.ReactIndexDBClient = void 0;
const errors_1 = require("../errors");
const react_indexdb_modal_1 = require("./react-indexdb-modal");
class ReactIndexDBClient {
constructor(dbName, schema, version = 1) {
this.db = null;
this.models = new Map();
this.dbName = dbName;
this.schema = schema;
this.version = version;
}
/**
* Ensure database is available before performing any operations.
*/
ensureDatabase() {
return __awaiter(this, void 0, void 0, function* () {
if (this.db)
return; // If DB is already available, return
yield this.connect();
});
}
connect() {
return __awaiter(this, void 0, void 0, function* () {
return new Promise((resolve, reject) => {
const request = indexedDB.open(this.dbName, this.version);
request.onupgradeneeded = (event) => {
const db = event.target.result;
this.createStores(db);
};
request.onsuccess = () => {
this.db = request.result;
this.initializeModels();
resolve();
};
request.onerror = () => {
reject(new errors_1.DatabaseError("Failed to connect to IndexedDB"));
};
});
});
}
createStores(db) {
this.schema.models.forEach((model) => {
if (!db.objectStoreNames.contains(model.name)) {
const store = db.createObjectStore(model.name, {
keyPath: "id",
autoIncrement: true,
});
// Create indexes for unique fields
Object.entries(model.fields).forEach(([fieldName, definition]) => {
if (definition.unique) {
store.createIndex(`${fieldName}_unique`, fieldName, { unique: true });
}
});
}
});
}
initializeModels() {
if (!this.db)
throw new errors_1.DatabaseError("Database not initialized");
this.schema.models.forEach((modelDef) => {
this.models.set(modelDef.name, new react_indexdb_modal_1.ReactIndexDBModel(this, modelDef)); // ✅ Pass `this` instead of `this.db`
});
}
getDatabase() {
return this.db;
}
getSchema() {
return this.schema;
}
model(name) {
if (!this.db)
throw new errors_1.DatabaseError("Database not initialized");
const model = this.models.get(name);
if (!model)
throw new errors_1.DatabaseError(`Model ${name} not found`);
return model;
}
}
exports.ReactIndexDBClient = ReactIndexDBClient;