Skip to content

Commit dc7b487

Browse files
committed
Fix module system
1 parent 5697247 commit dc7b487

File tree

14 files changed

+91
-68
lines changed

14 files changed

+91
-68
lines changed

Pragmatic/package.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"type": "module"
3+
}
Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Repository, Database } from './storage.js';
1+
import { Database } from './storage.js';
22

33
class Logger {
44
#output;
@@ -19,11 +19,11 @@ class Logger {
1919
}
2020

2121
const logger = new Logger('output');
22-
const db = await new Database('Example', 1, [
23-
{ name: 'user', options: { keyPath: 'id', autoIncrement: true } },
24-
]);
25-
26-
const repo = db.getRepo('user');
22+
const schemas = {
23+
user: { keyPath: 'id', autoIncrement: true },
24+
};
25+
const db = await new Database('Example', 1, schemas);
26+
const repo = db.getStore('user');
2727

2828
const actions = {
2929
add: async () => {
Lines changed: 35 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
class Repository {
2-
constructor(db, store) {
3-
this.db = db;
2+
constructor(store, db, schema) {
43
this.store = store;
4+
this.db = db;
5+
this.schema = schema;
56
}
67

78
insert(record) {
@@ -38,16 +39,19 @@ class Repository {
3839

3940
static #order(arr, order) {
4041
if (!order) return arr;
41-
const [field, dir] = order.split(' ');
42+
const [field, dir = 'asc'] = order.split(' ');
4243
const sign = dir === 'desc' ? -1 : 1;
43-
return [...arr].sort((a, b) => (a[field] > b[field] ? 1 : -1) * sign);
44+
return [...arr].sort((a, b) => {
45+
if (a[field] === b[field]) return 0;
46+
return a[field] > b[field] ? sign : -sign;
47+
});
4448
}
4549

4650
get({ id }) {
4751
return this.db.execute(this.store, 'readonly', (store) => {
4852
const req = store.get(id);
4953
return new Promise((resolve, reject) => {
50-
req.onerror = () => reject(req.error || new Error(`Cen't get ${id}`));
54+
req.onerror = () => reject(req.error || new Error(`Can't get ${id}`));
5155
req.onsuccess = () => resolve(req.result);
5256
});
5357
});
@@ -67,46 +71,56 @@ class Repository {
6771
class Database {
6872
#name;
6973
#version;
70-
#entities;
74+
#schemas;
7175
#instance;
7276
#active = false;
73-
#repositories = new Map();
77+
#stores = new Map();
7478

75-
constructor(name, version, entities) {
79+
constructor(name, version, schemas) {
7680
this.#name = name;
7781
this.#version = version;
78-
this.#entities = entities;
79-
return this.#connect();
82+
this.#schemas = schemas;
83+
return this.#open();
84+
}
85+
86+
async #open() {
87+
await this.#connect();
88+
await this.#init();
89+
return this;
8090
}
8191

8292
async #connect() {
8393
this.#instance = await new Promise((resolve, reject) => {
8494
const request = indexedDB.open(this.#name, this.#version);
8595
request.onupgradeneeded = (event) => this.#upgrade(event);
86-
request.onsuccess = () => {
96+
request.onsuccess = (event) => {
8797
this.#active = true;
88-
resolve(request.result);
98+
resolve(event.target.result);
99+
};
100+
request.onerror = (event) => {
101+
reject(event.target.error || new Error('IndexedDB open error'));
89102
};
90-
request.onerror = () =>
91-
reject(request.error || new Error('IndexedDB open error'));
92103
});
93-
for (const { name } of this.#entities) {
94-
this.#repositories.set(name, new Repository(this, name));
104+
}
105+
106+
#init() {
107+
for (const [name, schema] of Object.entries(this.#schemas)) {
108+
const store = new Repository(name, this, schema);
109+
this.#stores.set(name, store);
95110
}
96-
return this;
97111
}
98112

99113
#upgrade(event) {
100114
const db = event.target.result;
101-
for (const { name, options } of this.#entities) {
115+
for (const [name, schema] of Object.entries(this.#schemas)) {
102116
if (!db.objectStoreNames.contains(name)) {
103-
db.createObjectStore(name, options);
117+
db.createObjectStore(name, schema);
104118
}
105119
}
106120
}
107121

108-
getRepo(name) {
109-
return this.#repositories.get(name);
122+
getStore(name) {
123+
return this.#stores.get(name);
110124
}
111125

112126
async execute(storeName, mode, operation) {
Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@ import 'fake-indexeddb/auto';
44
import { Database } from '../static/storage.js';
55

66
test('Database connects and exposes repository', async () => {
7-
const entities = [
8-
{ name: 'user', options: { keyPath: 'id', autoIncrement: true } }
9-
];
7+
const entities = {
8+
user: { keyPath: 'id', autoIncrement: true },
9+
};
1010
const db = await new Database('TestDatabase', 1, entities);
11-
const repo = db.getRepo('user');
12-
assert.ok(repo);
11+
const user = db.getStore('user');
12+
assert.ok(user);
1313
});

Pragmatic/test/repository.js

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import test from 'node:test';
2+
import assert from 'node:assert/strict';
3+
import 'fake-indexeddb/auto';
4+
import { Database } from '../static/storage.js';
5+
6+
test('Repository performs basic CRUD', async () => {
7+
const schemas = {
8+
user: { keyPath: 'id', autoIncrement: true },
9+
};
10+
const db = await new Database('TestDatabase', 1, schemas);
11+
const user = db.getStore('user');
12+
13+
await user.insert({ name: 'Alice', age: 30 });
14+
await user.insert({ name: 'Bob', age: 20 });
15+
16+
const users = await user.select();
17+
assert.equal(users.length, 2);
18+
19+
const record = await user.get({ id: 1 });
20+
assert.equal(record.name, 'Alice');
21+
22+
record.age++;
23+
await user.update(record);
24+
25+
const updated = await user.get({ id: 1 });
26+
assert.equal(updated.age, 31);
27+
28+
await user.delete({ id: 2 });
29+
const remaining = await user.select();
30+
assert.equal(remaining.length, 1);
31+
});

README.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33
## Quick start
44

55
1. Install dependencies `npm i`
6-
2. Start server `node server.js` from `./Server`
6+
2. Start server
7+
- Usage: `node server <folder>`
8+
- Example: `node server Pragmatic`
79
3. Open in browser: [http://127.0.0.1:8000/](http://127.0.0.1:8000/)
810

911
## License & Contributors

0 commit comments

Comments
 (0)