local-fake-api
Version:
A simple async local mock API without backend.
130 lines (82 loc) • 2.8 kB
Markdown
# local-fake-api
A simple **async local mock API** without backend.
✅ **Designed for prototyping or fast iterations**
✅ **REST-style responses**
✅ **Supports IndexedDB or LocalStorage**
✅ **Simulate an async API effortlessly**
## Installation
```bash
npm install local-fake-api
```
## CRUD API
### Factory
#### `createApi<T>(tableName: string): Api<T>`
Creates a **table-scoped API instance** that uses `tableName` as:
- **IndexedDB:** object store name
- **LocalStorage:** key name
- **Returns:** CRUD methods for type `T` with REST-style responses.
## Methods
All methods return a **REST-style response**:
```ts
interface ApiResponse<T = unknown> {
data?: T; // the result data
success: boolean; // true if operation succeeded
message?: string; // optional error message
}
```
### `list(filter?: Partial<Record<string, unknown>>): Promise<ApiResponse<{ data: T[]; total: number,success: boolean }>>`
Fetch all stored items (optionally filtered).
- **data:** T[]
- **total:** total items count
- **success:** `true` if operation succeeds
**Example:**
```ts
const res = await api.list({ done: true });
if (res.success) {
console.log(res.data?.data, res.data?.total);
}
```
### `get(id: string, keyName?: keyof T): Promise<ApiResponse<T | null>>`
Fetch a single item by `id` (or other key).
### `create(item: Omit<T, "id">): Promise<ApiResponse<T>>`
Create a new item (auto-generates `id`).
### `update(id: string, updates: Partial<Omit<T, "id">>, keyName?: keyof T): Promise<ApiResponse<T | null>>`
Update specific fields of an item by `id`.
### `delete(id: string, keyName?: keyof T): Promise<ApiResponse<void>>`
Delete an item by `id`.
### `clearAll(filter?: Partial<Record<string, unknown>>): Promise<ApiResponse<void>>`
Clear all items (optionally filter items to keep).
## Example
```ts
type Todo = { id: string; text: string; done: boolean };
type Note = { id: string; title: string; content: string };
const todoApi = createApi<Todo>("todos");
const noteApi = createApi<Note>("notes");
async function run() {
console.log("\n=== TODOS ===");
await todoApi.clearAll();
const newTodo = await todoApi.create({ text: "Buy milk", done: false });
console.log("Added todo:", newTodo);
console.log("All todos:", await todoApi.list());
const updatedTodo = await todoApi.update(newTodo.data!.id, { done: true });
console.log("Updated todo:", updatedTodo);
await todoApi.delete(newTodo.data!.id);
console.log("Todo deleted. Remaining todos:", await todoApi.list());
console.log("\n=== NOTES ===");
await noteApi.clearAll();
const newNote = await noteApi.add({
title: "Meeting Notes",
content: "Discuss project roadmap.",
});
console.log("Added note:", newNo
```