UNPKG

react-indexeddb-kit

Version:

A TypeScript-based React IndexedDB wrapper with CRUD operations.

91 lines (90 loc) 3.59 kB
"use strict"; 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;