xdriver 2.0.1 → 2.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/database.js CHANGED
@@ -1,146 +1,62 @@
1
- import { IndexdbStatus, innerDB } from "./const";
2
- import Table from "./table";
3
- import { Logger } from './com';
4
- const logger = Logger.getLogger('Database');
5
- export default class Database {
6
- constructor(database, version = 1) {
7
- this.eventMap = {};
8
- this.name = database;
9
- this.version = version;
10
- this.tableMap = new Map();
11
- }
12
- on(event, handle) {
13
- this.eventMap[event] = handle;
14
- return this;
15
- }
16
- get connected() {
17
- return this.database != void 0;
18
- }
19
- connect(name, version) {
20
- var _a;
21
- if (!name && version == void 0 && this.connected) {
22
- return Promise.resolve(this);
23
- }
24
- this.name = name || this.name;
25
- this.version = version || this.version;
26
- const request = innerDB.open(this.name, version);
27
- (_a = this.eventMap.process) === null || _a === void 0 ? void 0 : _a.call(this, IndexdbStatus.CONNECT_ING);
28
- request.onerror = (e) => {
29
- var _a, _b;
30
- logger.error('onerror', e);
31
- (_a = this.eventMap.process) === null || _a === void 0 ? void 0 : _a.call(this, IndexdbStatus.CONNECT_ERROR);
32
- (_b = this.eventMap.error) === null || _b === void 0 ? void 0 : _b.call(this, e);
33
- };
34
- request.onblocked = (evt) => {
35
- var _a, _b;
36
- logger.warn(`onblocked change from ${evt.oldVersion} to ${evt.newVersion}`, evt);
37
- (_a = this.eventMap.process) === null || _a === void 0 ? void 0 : _a.call(this, IndexdbStatus.CONNECT_CLOSE);
38
- (_b = this.eventMap.blocked) === null || _b === void 0 ? void 0 : _b.call(this, evt);
39
- };
40
- return new Promise((resolve, reject) => {
41
- request.onupgradeneeded = (event) => {
42
- var _a, _b;
43
- logger.info(`Version change from <${event.oldVersion}> to <${event.newVersion}>`, event);
44
- (_a = this.eventMap.process) === null || _a === void 0 ? void 0 : _a.call(this, IndexdbStatus.VERSION_CHANGE);
45
- const target = event.target;
46
- this.database = target.result;
47
- (_b = this.eventMap.change) === null || _b === void 0 ? void 0 : _b.call(this, this.database);
48
- };
49
- request.onsuccess = (e) => {
50
- var _a, _b;
51
- logger.info(`Connect Success`, e);
52
- const target = e.target;
53
- let connect = target.result;
54
- this.database = connect;
55
- let objectStoreNames = connect.objectStoreNames;
56
- if (objectStoreNames.length) {
57
- let transaction = connect.transaction(objectStoreNames);
58
- for (let i = 0; i < objectStoreNames.length; i++) {
59
- let table = objectStoreNames.item(i);
60
- if (!table)
61
- continue;
62
- let objectStore = transaction.objectStore(table);
63
- let { indexNames, keyPath: primaryKey, name, autoIncrement = true } = objectStore;
64
- let indexes = [];
65
- for (let j = 0; indexNames && j < indexNames.length; j++) {
66
- let indexName = indexNames.item(j);
67
- if (!indexName)
68
- continue;
69
- let { keyPath, name, multiEntry, unique } = objectStore.index(indexName);
70
- indexes.push({ name, column: keyPath, unique, multiEntry });
71
- }
72
- this.tableMap.set(name, new Table({ name, primaryKey: primaryKey == null ? void 0 : primaryKey, autoIncrement, indexes }, this.database));
73
- }
74
- }
75
- (_a = this.eventMap.process) === null || _a === void 0 ? void 0 : _a.call(this, IndexdbStatus.CONNECT_SUCCESS);
76
- (_b = this.eventMap.success) === null || _b === void 0 ? void 0 : _b.call(this, this.database);
77
- resolve(this);
78
- };
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import Connection from "./connection";
11
+ export default class Database extends Connection {
12
+ query(table, query, count = 1000) {
13
+ return this.table(table).query(query, count);
14
+ }
15
+ select(table, key, index, count = 1000) {
16
+ return this.table(table).select(key, count, index);
17
+ }
18
+ queryByKey(table, key) {
19
+ return this.table(table).queryByKey(key);
20
+ }
21
+ queryByIndex(table, indexName, key, count) {
22
+ return __awaiter(this, void 0, void 0, function* () {
23
+ return this.table(table).queryByIndex(indexName, key, count);
79
24
  });
80
25
  }
81
- drop() {
82
- return new Promise((resolve, reject) => {
83
- let request = innerDB.deleteDatabase(this.name);
84
- request.onerror = function (event) {
85
- reject(event);
86
- };
87
- request.onsuccess = function (event) {
88
- resolve(event);
89
- };
90
- this.close();
26
+ queryById(table, id, indexName) {
27
+ return __awaiter(this, void 0, void 0, function* () {
28
+ return this.table(table).queryById(id, indexName);
91
29
  });
92
30
  }
93
- close() {
94
- var _a, _b, _c;
95
- if (this.connected) {
96
- (_a = this.eventMap.process) === null || _a === void 0 ? void 0 : _a.call(this, IndexdbStatus.CONNECT_CLOSE);
97
- (_b = this.database) === null || _b === void 0 ? void 0 : _b.close();
98
- (_c = this.eventMap.close) === null || _c === void 0 ? void 0 : _c.call(this);
99
- this.database = void 0;
100
- }
31
+ count(table, key) {
32
+ return this.table(table).count(key);
101
33
  }
102
- createTable(tableName, meta = {}) {
103
- var _a, _b;
104
- if (this.exists(tableName)) {
105
- throw new Error(`Table ${tableName} is exists`);
106
- }
107
- const metadata = Object.assign(Object.assign({}, meta), { name: tableName });
108
- let { name = '', primaryKey = 'id', autoIncrement = true, indexes = [], rows = [] } = metadata;
109
- const store = (_a = this.database) === null || _a === void 0 ? void 0 : _a.createObjectStore(name, { keyPath: primaryKey, autoIncrement });
110
- let idxes = indexes.map(({ name, column, unique, multiEntry }) => {
111
- store === null || store === void 0 ? void 0 : store.createIndex(name, column, { unique, multiEntry });
112
- return { name, column, unique, multiEntry };
113
- });
114
- (_b = metadata.rows) === null || _b === void 0 ? void 0 : _b.forEach(row => store === null || store === void 0 ? void 0 : store.add(row));
115
- let tab = new Table({ name, primaryKey, autoIncrement, indexes: idxes }, this.database);
116
- this.tableMap.set(name, tab);
117
- return tab;
34
+ insert(table, data) {
35
+ return this.table(table).insert(data);
118
36
  }
119
- createTables(tables, meta = {}) {
120
- return tables.map(table => {
121
- return this.createTable(table, meta);
122
- });
37
+ update(table, modify, key) {
38
+ return this.table(table).update(modify, key);
123
39
  }
124
- dropTable(tableName) {
125
- var _a;
126
- if (this.exists(tableName)) {
127
- (_a = this.database) === null || _a === void 0 ? void 0 : _a.deleteObjectStore(tableName);
128
- this.tableMap.delete(tableName);
129
- return true;
130
- }
131
- return false;
40
+ delete(table, key) {
41
+ return this.table(table).delete(key);
132
42
  }
133
- table(tableName) {
134
- const table = this.tableMap.get(tableName);
135
- if (!table) {
136
- logger.error(`Table ${tableName} is not exists`);
137
- }
138
- return table;
43
+ truncate(table) {
44
+ return this.table(table).truncate();
139
45
  }
140
- exists(table) {
141
- return this.tableMap.has(table);
46
+ getPagination(table, pageSize = 10) {
47
+ return this.table(table).getPagination(pageSize, 1);
142
48
  }
143
- getTables() {
144
- return this.tableMap.values();
49
+ scan(table_1, key_1) {
50
+ return __awaiter(this, arguments, void 0, function* (table, key, direction = 'next', indexName) {
51
+ return this.table(table).scan(key, direction, indexName);
52
+ });
53
+ }
54
+ getAllData(table) {
55
+ return this.table(table).getAllData();
56
+ }
57
+ paginate(table_1) {
58
+ return __awaiter(this, arguments, void 0, function* (table, pageNo = 1, pageSize = 10, key, indexName) {
59
+ return this.table(table).paginate(pageNo, pageSize, key, indexName);
60
+ });
145
61
  }
146
62
  }
package/lib/index.d.ts CHANGED
@@ -1,6 +1,15 @@
1
1
  import { IndexdbStatus, KeyRange } from "./const";
2
- import Driver from "./driver";
3
2
  import Database from "./database";
4
- import Table from "./table";
5
- export { IndexdbStatus, KeyRange, Database, Table, Driver };
3
+ import Connection from "./connection";
4
+ import Table, { TableMeta } from "./table";
5
+ export { IndexdbStatus, KeyRange, Connection, Table };
6
+ declare class Driver {
7
+ private readonly name;
8
+ private version;
9
+ private readonly tables;
10
+ constructor(name: string, version?: number);
11
+ defineTables(...tables: Array<TableMeta>): this;
12
+ private hasChange;
13
+ connect(version?: number): Promise<Database>;
14
+ }
6
15
  export default Driver;
package/lib/index.js CHANGED
@@ -1,6 +1,140 @@
1
- import { IndexdbStatus, KeyRange } from "./const";
2
- import Driver from "./driver";
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import { IndexdbStatus, innerDB, KeyRange } from "./const";
3
11
  import Database from "./database";
12
+ import Connection from "./connection";
4
13
  import Table from "./table";
5
- export { IndexdbStatus, KeyRange, Database, Table, Driver };
14
+ import { Logger } from "./com";
15
+ export { IndexdbStatus, KeyRange, Connection, Table };
16
+ const logger = Logger.getLogger("Driver");
17
+ class Driver {
18
+ constructor(name, version = 0) {
19
+ this.tables = [];
20
+ this.name = name;
21
+ this.version = version;
22
+ }
23
+ defineTables(...tables) {
24
+ this.tables.push(...tables);
25
+ logger.debug(`Define tables: ${tables.map(t => t.name).join(', ')}`);
26
+ return this;
27
+ }
28
+ hasChange(database) {
29
+ return __awaiter(this, void 0, void 0, function* () {
30
+ var _a;
31
+ const existTables = database.getTables();
32
+ const defineTables = this.tables;
33
+ if (existTables.length !== defineTables.length) {
34
+ logger.warn(`Table count is changed.`);
35
+ return true;
36
+ }
37
+ let change = false;
38
+ for (let table of defineTables) {
39
+ if (!existTables.some(t => t.name === table.name)) {
40
+ logger.warn(`Table ${table.name} is added, create it.`);
41
+ change = true;
42
+ break;
43
+ }
44
+ }
45
+ if (change) {
46
+ return change;
47
+ }
48
+ for (let existTable of existTables) {
49
+ const tableMeta = defineTables.find(t => t.name === existTable.name);
50
+ if (!tableMeta) {
51
+ logger.warn(`Table ${existTable.name} is removed, drop it.`);
52
+ change = true;
53
+ break;
54
+ }
55
+ let existIndexes = existTable.indexes || [];
56
+ for (let existIndex of existIndexes) {
57
+ const metaIndex = (_a = tableMeta.indexes) === null || _a === void 0 ? void 0 : _a.find(i => i.name === existIndex.name);
58
+ if (!metaIndex) {
59
+ logger.warn(`Table ${existTable.name} index ${existIndex.name} is removed, drop it.`);
60
+ change = true;
61
+ break;
62
+ }
63
+ }
64
+ if (change) {
65
+ break;
66
+ }
67
+ for (let metaIndex of tableMeta.indexes || []) {
68
+ const index = existIndexes.find(i => i.name === metaIndex.name);
69
+ if (!index) {
70
+ logger.warn(`Table ${existTable.name} index ${metaIndex.name} is added, create it.`);
71
+ change = true;
72
+ break;
73
+ }
74
+ }
75
+ if (change) {
76
+ break;
77
+ }
78
+ }
79
+ return change;
80
+ });
81
+ }
82
+ connect(version) {
83
+ return __awaiter(this, void 0, void 0, function* () {
84
+ const databases = yield innerDB.databases();
85
+ const existsDB = databases.find(db => db.name === this.name);
86
+ if (existsDB) {
87
+ logger.info(`Database ${this.name} exists`);
88
+ this.version = existsDB.version || this.version;
89
+ }
90
+ if (version) {
91
+ this.version = Math.max(this.version, version);
92
+ }
93
+ logger.debug(`Connect to database ${this.name} ${this.version}`);
94
+ const database = new Database(this.name, this.version);
95
+ database.on('change', (idbDatabase, event) => {
96
+ const existTables = [...idbDatabase.objectStoreNames];
97
+ if (existTables.length) {
98
+ for (let tableName of existTables) {
99
+ let existTable = this.tables.find(t => t.name === tableName);
100
+ if (!existTable) {
101
+ logger.warn(`Table ${tableName} is removed, drop it.`);
102
+ database.dropTable(tableName);
103
+ continue;
104
+ }
105
+ const transaction = event.target.transaction;
106
+ if (!transaction) {
107
+ logger.warn(`Transaction not support`);
108
+ continue;
109
+ }
110
+ let objectStore = transaction.objectStore(tableName);
111
+ if (!objectStore) {
112
+ logger.warn(`Table ${tableName} not exists`);
113
+ continue;
114
+ }
115
+ let { indexNames } = objectStore;
116
+ for (let indexName of indexNames) {
117
+ objectStore.deleteIndex(indexName);
118
+ }
119
+ for (let index of existTable.indexes || []) {
120
+ objectStore.createIndex(index.name, index.column, Object.assign({}, index));
121
+ }
122
+ }
123
+ }
124
+ for (let table of this.tables) {
125
+ if (existTables.indexOf(table.name) < 0) {
126
+ logger.info(`Table ${table.name} is not exist, create it.`);
127
+ database.createTable(table.name, table);
128
+ }
129
+ }
130
+ });
131
+ yield database.connect();
132
+ if (yield this.hasChange(database)) {
133
+ database.close();
134
+ yield database.connect(this.name, ++this.version);
135
+ }
136
+ return database;
137
+ });
138
+ }
139
+ }
6
140
  export default Driver;
package/lib/table.d.ts CHANGED
@@ -12,9 +12,43 @@ export type ITable = {
12
12
  };
13
13
  export type Row = Record<string, any>;
14
14
  export type Rows = Array<Row>;
15
- export type Metadata = ITable & {
15
+ export type TableMeta = ITable & {
16
16
  rows?: Rows;
17
17
  };
18
+ export declare class RowPacket<T extends Row> extends Array<T> {
19
+ constructor(rows?: Array<T>);
20
+ distinct(column?: string | ((row: T) => any)): Array<T>;
21
+ mapping<K, T>(keyFn: (row: T, index: number, array: Array<T>) => K): Map<K, T>;
22
+ mapping<K, V>(keyFn: (row: T, index: number, array: Array<T>) => K, valFn: (row: T, index: number, array: Array<T>) => V): Map<K, V>;
23
+ group<K, V>(key: keyof T | ((row: T, index: number, array: Array<T>) => K)): Map<K, Array<T>>;
24
+ group<K, V>(key: keyof T | ((row: T, index: number, array: Array<T>) => K), valFn: (row: T, index: number, array: Array<T>) => V): Map<K, Array<V>>;
25
+ max(keyFn: keyof T | ((row: T, index: number, array: Array<T>) => number)): {
26
+ value: number;
27
+ rows: Array<T>;
28
+ };
29
+ min(keyFn: keyof T | ((row: T, index: number, array: Array<T>) => number)): {
30
+ value: number;
31
+ rows: Array<T>;
32
+ };
33
+ sum(keyFn: keyof T | ((row: T, index: number, array: Array<T>) => number)): number;
34
+ average(keyFn: keyof T | ((row: T, index: number, array: Array<T>) => number)): number;
35
+ }
36
+ export declare class Pagination<T extends Row> {
37
+ private readonly _data;
38
+ private readonly _pageSize;
39
+ private _pageIndex;
40
+ private readonly _total;
41
+ constructor(data: Array<T>, pageSize?: number, pageIndex?: number);
42
+ get totalPage(): number;
43
+ get total(): number;
44
+ get pageIndex(): number;
45
+ get pageSize(): number;
46
+ get hasNext(): boolean;
47
+ get hasPrev(): boolean;
48
+ get data(): Array<any>;
49
+ prev(): boolean;
50
+ next(): boolean;
51
+ }
18
52
  export default class Table implements ITable {
19
53
  readonly name: string;
20
54
  readonly primaryKey: string | string[];
@@ -22,19 +56,21 @@ export default class Table implements ITable {
22
56
  readonly indexes: Array<Index>;
23
57
  readonly database?: IDBDatabase;
24
58
  constructor(table: ITable | string, database?: IDBDatabase);
25
- insert(data: Row | Rows): Promise<any[]>;
26
- update(modify: Row, key?: IDBValidKey | IDBKeyRange | null, count?: number): Promise<IDBValidKey>;
27
- merge(row: Row): Promise<IDBValidKey> | Promise<any[]>;
59
+ get meta(): TableMeta;
60
+ insert(data: Row | Rows): Promise<Array<IDBValidKey>>;
61
+ update(modify: Row, key?: IDBValidKey | IDBKeyRange | null): Promise<IDBValidKey>;
28
62
  delete(key: IDBValidKey | IDBKeyRange): Promise<any[]>;
29
- clear(): Promise<undefined>;
63
+ truncate(): Promise<void>;
30
64
  dropIndex(name: string): void;
31
65
  keys(key?: IDBValidKey | IDBKeyRange | null, count?: number): Promise<IDBValidKey[]>;
32
66
  count(key?: IDBValidKey | IDBKeyRange): Promise<number>;
33
- query(key?: IDBValidKey | IDBKeyRange, count?: number): Promise<Rows>;
34
- select(key?: IDBValidKey | IDBKeyRange, count?: number, index?: string): Promise<Rows>;
35
- queryByKey(key: IDBValidKey | IDBKeyRange): Promise<Row>;
36
- fetch(key?: IDBValidKey | IDBKeyRange, direction?: IDBCursorDirection): Promise<Rows>;
37
- queryByIndex(indexName: string, key?: IDBValidKey | IDBKeyRange, count?: number): Promise<Rows>;
38
- deplete(key?: IDBValidKey | IDBKeyRange, direction?: IDBCursorDirection): Promise<Rows>;
39
- multiple(indexName: string, key?: IDBValidKey | IDBKeyRange, direction?: IDBCursorDirection): Promise<Rows>;
67
+ query<R extends Row>(key?: IDBValidKey | IDBKeyRange, count?: number): Promise<RowPacket<R>>;
68
+ queryByIndex<R extends Row>(indexName: string, key?: IDBValidKey | IDBKeyRange, count?: number): Promise<RowPacket<R>>;
69
+ select<R extends Row>(key?: IDBValidKey | IDBKeyRange, count?: number, indexName?: string): Promise<RowPacket<R>>;
70
+ queryByKey<R extends Row>(key: IDBValidKey | IDBKeyRange): Promise<RowPacket<R>>;
71
+ paginate<R extends Row>(pageNo?: number, pageSize?: number, key?: IDBValidKey | IDBKeyRange, indexName?: string): Promise<RowPacket<R>>;
72
+ queryById<R extends Row>(id: any | Array<any>, indexName?: string): Promise<R>;
73
+ scan<R extends Row>(key?: IDBValidKey | IDBKeyRange, direction?: IDBCursorDirection, indexName?: string): Promise<RowPacket<R>>;
74
+ getAllData<R extends Row>(): Promise<Array<R>>;
75
+ getPagination<R extends Row>(pageSize?: number, pageIndex?: number): Promise<Pagination<R>>;
40
76
  }