@koishijs/plugin-database-memory 1.0.0-beta.2 → 1.0.0-beta.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/index.d.ts +8 -5
- package/lib/index.js +18 -26
- package/lib/index.js.map +2 -2
- package/package.json +5 -3
package/lib/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/// <reference types="koishi/lib" />
|
|
2
|
-
import { Context, Database, TableType, Dict } from 'koishi';
|
|
2
|
+
import { Context, Database, Query, TableType, Dict } from 'koishi';
|
|
3
3
|
import { Config } from './storage';
|
|
4
4
|
declare module 'koishi' {
|
|
5
5
|
interface Database {
|
|
@@ -17,12 +17,15 @@ export declare class MemoryDatabase extends Database {
|
|
|
17
17
|
private _storage;
|
|
18
18
|
constructor(ctx: Context, config?: Config);
|
|
19
19
|
start(): Promise<void>;
|
|
20
|
-
$drop(name?: string): Promise<void>;
|
|
21
20
|
$save(name: string): Promise<void>;
|
|
22
21
|
stop(): void;
|
|
23
22
|
$table<K extends TableType>(table: K): any[];
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
23
|
+
drop(name: TableType): Promise<void>;
|
|
24
|
+
get(name: TableType, query: Query, modifier?: Query.Modifier): Promise<Pick<any, string>[]>;
|
|
25
|
+
set(name: TableType, query: Query, data: {}): Promise<void>;
|
|
26
|
+
remove(name: TableType, query: Query): Promise<void>;
|
|
27
|
+
create(name: TableType, data: any): Promise<any>;
|
|
28
|
+
upsert(name: TableType, data: any[], key: string | string[]): Promise<void>;
|
|
29
|
+
aggregate(name: TableType, fields: {}, query: Query): Promise<any>;
|
|
27
30
|
}
|
|
28
31
|
export default MemoryDatabase;
|
package/lib/index.js
CHANGED
|
@@ -126,10 +126,6 @@ var MemoryDatabase = class extends import_koishi.Database {
|
|
|
126
126
|
var _a;
|
|
127
127
|
await ((_a = this._storage) == null ? void 0 : _a.start(this.$store));
|
|
128
128
|
}
|
|
129
|
-
async $drop(name) {
|
|
130
|
-
var _a;
|
|
131
|
-
await ((_a = this._storage) == null ? void 0 : _a.drop(name));
|
|
132
|
-
}
|
|
133
129
|
async $save(name) {
|
|
134
130
|
var _a;
|
|
135
131
|
await ((_a = this._storage) == null ? void 0 : _a.save(name, this.$store[name]));
|
|
@@ -140,43 +136,38 @@ var MemoryDatabase = class extends import_koishi.Database {
|
|
|
140
136
|
var _a;
|
|
141
137
|
return (_a = this.$store)[table] || (_a[table] = []);
|
|
142
138
|
}
|
|
143
|
-
};
|
|
144
|
-
__name(MemoryDatabase, "MemoryDatabase");
|
|
145
|
-
(function(MemoryDatabase2) {
|
|
146
|
-
MemoryDatabase2.name = "database-memory";
|
|
147
|
-
})(MemoryDatabase || (MemoryDatabase = {}));
|
|
148
|
-
import_koishi.Database.extend(MemoryDatabase, {
|
|
149
139
|
async drop(name) {
|
|
140
|
+
var _a;
|
|
150
141
|
if (name) {
|
|
151
142
|
delete this.$store[name];
|
|
152
143
|
} else {
|
|
153
144
|
this.$store = {};
|
|
154
145
|
}
|
|
155
|
-
await this
|
|
156
|
-
}
|
|
146
|
+
await ((_a = this._storage) == null ? void 0 : _a.drop(name));
|
|
147
|
+
}
|
|
157
148
|
async get(name, query, modifier) {
|
|
158
|
-
const expr =
|
|
149
|
+
const expr = this.ctx.model.resolveQuery(name, query);
|
|
159
150
|
const { fields, limit = Infinity, offset = 0 } = import_koishi.Query.resolveModifier(modifier);
|
|
160
151
|
return this.$table(name).filter((row) => (0, import_orm_utils.executeQuery)(expr, row)).map((row) => (0, import_koishi.clone)((0, import_koishi.pick)(row, fields))).slice(offset, offset + limit);
|
|
161
|
-
}
|
|
152
|
+
}
|
|
162
153
|
async set(name, query, data) {
|
|
163
|
-
const expr =
|
|
154
|
+
const expr = this.ctx.model.resolveQuery(name, query);
|
|
164
155
|
this.$table(name).filter((row) => (0, import_orm_utils.executeQuery)(expr, row)).forEach((row) => Object.assign(row, data));
|
|
165
156
|
this.$save(name);
|
|
166
|
-
}
|
|
157
|
+
}
|
|
167
158
|
async remove(name, query) {
|
|
168
|
-
const expr =
|
|
159
|
+
const expr = this.ctx.model.resolveQuery(name, query);
|
|
169
160
|
this.$store[name] = this.$table(name).filter((row) => !(0, import_orm_utils.executeQuery)(expr, row));
|
|
170
161
|
this.$save(name);
|
|
171
|
-
}
|
|
162
|
+
}
|
|
172
163
|
async create(name, data) {
|
|
173
164
|
const store = this.$table(name);
|
|
174
|
-
const { primary, fields, autoInc } =
|
|
165
|
+
const { primary, fields, autoInc } = this.ctx.model.config[name];
|
|
175
166
|
data = (0, import_koishi.clone)(data);
|
|
176
167
|
if (!Array.isArray(primary) && autoInc && !(primary in data)) {
|
|
177
168
|
const max = store.length ? Math.max(...store.map((row) => +row[primary])) : 0;
|
|
178
169
|
data[primary] = max + 1;
|
|
179
|
-
if (import_koishi.
|
|
170
|
+
if (import_koishi.Model.Field.string.includes(fields[primary].type)) {
|
|
180
171
|
data[primary] += "";
|
|
181
172
|
}
|
|
182
173
|
} else {
|
|
@@ -184,13 +175,13 @@ import_koishi.Database.extend(MemoryDatabase, {
|
|
|
184
175
|
if (duplicated.length)
|
|
185
176
|
return;
|
|
186
177
|
}
|
|
187
|
-
const copy = __spreadValues(__spreadValues({},
|
|
178
|
+
const copy = __spreadValues(__spreadValues({}, this.ctx.model.create(name)), data);
|
|
188
179
|
store.push(copy);
|
|
189
180
|
this.$save(name);
|
|
190
181
|
return copy;
|
|
191
|
-
}
|
|
182
|
+
}
|
|
192
183
|
async upsert(name, data, key) {
|
|
193
|
-
const keys = (0, import_koishi.makeArray)(key ||
|
|
184
|
+
const keys = (0, import_koishi.makeArray)(key || this.ctx.model.config[name].primary);
|
|
194
185
|
for (const item of data) {
|
|
195
186
|
const row = this.$table(name).find((row2) => {
|
|
196
187
|
return keys.every((key2) => row2[key2] === item[key2]);
|
|
@@ -202,13 +193,14 @@ import_koishi.Database.extend(MemoryDatabase, {
|
|
|
202
193
|
}
|
|
203
194
|
}
|
|
204
195
|
this.$save(name);
|
|
205
|
-
}
|
|
196
|
+
}
|
|
206
197
|
async aggregate(name, fields, query) {
|
|
207
|
-
const expr =
|
|
198
|
+
const expr = this.ctx.model.resolveQuery(name, query);
|
|
208
199
|
const table = this.$table(name).filter((row) => (0, import_orm_utils.executeQuery)(expr, row));
|
|
209
200
|
return (0, import_koishi.valueMap)(fields, (expr2) => (0, import_orm_utils.executeEval)(expr2, table));
|
|
210
201
|
}
|
|
211
|
-
}
|
|
202
|
+
};
|
|
203
|
+
__name(MemoryDatabase, "MemoryDatabase");
|
|
212
204
|
var src_default = MemoryDatabase;
|
|
213
205
|
// Annotate the CommonJS export names for ESM import in node:
|
|
214
206
|
0 && (module.exports = {
|
package/lib/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/index.ts", "../src/storage/node.ts"],
|
|
4
|
-
"sourcesContent": ["import { Context, Database, Query,
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA,
|
|
4
|
+
"sourcesContent": ["import { Context, Database, Query, TableType, clone, makeArray, pick, Dict, valueMap, Model } from 'koishi'\nimport { executeEval, executeQuery } from '@koishijs/orm-utils'\nimport { Storage, Config } from './storage'\n\ndeclare module 'koishi' {\n interface Database {\n memory: MemoryDatabase\n }\n\n interface Modules {\n 'database-memory': typeof import('.')\n }\n}\n\nexport class MemoryDatabase extends Database {\n public memory = this\n public $store: Dict<any[]> = {}\n\n private _storage: Storage\n\n constructor(public ctx: Context, public config: Config = {}) {\n super(ctx)\n\n if (config.storage) {\n this._storage = new Storage(ctx, config)\n }\n }\n\n async start() {\n await this._storage?.start(this.$store)\n }\n\n async $save(name: string) {\n await this._storage?.save(name, this.$store[name])\n }\n\n stop() {}\n\n $table<K extends TableType>(table: K) {\n return this.$store[table] ||= []\n }\n\n async drop(name: TableType) {\n if (name) {\n delete this.$store[name]\n } else {\n this.$store = {}\n }\n await this._storage?.drop(name)\n }\n\n async get(name: TableType, query: Query, modifier?: Query.Modifier) {\n const expr = this.ctx.model.resolveQuery(name, query)\n const { fields, limit = Infinity, offset = 0 } = Query.resolveModifier(modifier)\n return this.$table(name)\n .filter(row => executeQuery(expr, row))\n .map(row => clone(pick(row, fields)))\n .slice(offset, offset + limit)\n }\n\n async set(name: TableType, query: Query, data: {}) {\n const expr = this.ctx.model.resolveQuery(name, query)\n this.$table(name)\n .filter(row => executeQuery(expr, row))\n .forEach(row => Object.assign(row, data))\n this.$save(name)\n }\n\n async remove(name: TableType, query: Query) {\n const expr = this.ctx.model.resolveQuery(name, query)\n this.$store[name] = this.$table(name)\n .filter(row => !executeQuery(expr, row))\n this.$save(name)\n }\n\n async create(name: TableType, data: any) {\n const store = this.$table(name)\n const { primary, fields, autoInc } = this.ctx.model.config[name]\n data = clone(data)\n if (!Array.isArray(primary) && autoInc && !(primary in data)) {\n const max = store.length ? Math.max(...store.map(row => +row[primary])) : 0\n data[primary] = max + 1\n if (Model.Field.string.includes(fields[primary].type)) {\n data[primary] += ''\n }\n } else {\n const duplicated = await this.get(name, pick(data, makeArray(primary)))\n if (duplicated.length) return\n }\n const copy = { ...this.ctx.model.create(name), ...data }\n store.push(copy)\n this.$save(name)\n return copy\n }\n\n async upsert(name: TableType, data: any[], key: string | string[]) {\n const keys = makeArray(key || this.ctx.model.config[name].primary)\n for (const item of data) {\n const row = this.$table(name).find(row => {\n return keys.every(key => row[key] === item[key])\n })\n if (row) {\n Object.assign(row, clone(item))\n } else {\n await this.create(name, item)\n }\n }\n this.$save(name)\n }\n\n async aggregate(name: TableType, fields: {}, query: Query) {\n const expr = this.ctx.model.resolveQuery(name, query)\n const table = this.$table(name).filter(row => executeQuery(expr, row))\n return valueMap(fields, expr => executeEval(expr, table)) as any\n }\n}\n\nexport default MemoryDatabase\n", "import type * as yaml from 'js-yaml'\nimport { Context } from 'koishi'\nimport { promises as fs } from 'fs'\nimport { extname, resolve } from 'path'\n\ntype Loader = 'json' | 'yaml' | 'yml'\nconst loaders = ['json', 'yaml', 'yml']\n\nexport interface Config {\n loader?: Loader\n root?: string\n}\n\nexport class Storage {\n constructor(ctx: Context, private config: Config) {\n config.loader ||= 'json'\n config.root ||= resolve(ctx.app.options.baseDir, '.koishi/database')\n if (!loaders.includes(config.loader)) {\n throw new Error(`unsupported loader \"${config.loader}\"`)\n }\n }\n\n async start(tables: Record<string, any[]>) {\n const { root, loader } = this.config\n await fs.mkdir(root, { recursive: true })\n const files = await fs.readdir(root)\n await Promise.all(files.map(async (filename) => {\n const extension = extname(filename)\n if (extension !== loader) return\n const buffer = await fs.readFile(filename)\n try {\n const data = await this.load(buffer, loader)\n const name = filename.slice(0, -1 - extension.length)\n tables[name] = data\n } catch {}\n }))\n }\n\n async load(buffer: Buffer, loader: Loader) {\n if (loader === 'json') {\n return JSON.parse(buffer.toString())\n } else if (loader === 'yaml' || loader === 'yml') {\n const { load } = require('js-yaml') as typeof yaml\n return load(buffer.toString())\n }\n }\n\n async drop(name?: string) {\n const { root, loader } = this.config\n if (name) {\n await fs.rm(resolve(root, `${name}.${loader}`))\n } else {\n await fs.rm(root, { recursive: true, force: true })\n }\n }\n\n async save(name: string, table: any[]) {\n const { root, loader } = this.config\n try {\n const buffer = await this.dump(table, loader)\n await fs.writeFile(resolve(root, `${name}.${loader}`), buffer)\n } catch {}\n }\n\n async dump(data: any, loader: Loader) {\n if (loader === 'json') {\n return JSON.stringify(data)\n } else if (loader === 'yaml' || loader === 'yml') {\n const { dump } = require('js-yaml') as typeof yaml\n return dump(data)\n }\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@koishijs/plugin-database-memory",
|
|
3
3
|
"description": "A in-memory database implementation for Koishi",
|
|
4
|
-
"version": "1.0.0-beta.
|
|
4
|
+
"version": "1.0.0-beta.3",
|
|
5
5
|
"main": "lib/node.js",
|
|
6
6
|
"module": "lib/browser.js",
|
|
7
7
|
"typings": "lib/index.d.ts",
|
|
@@ -30,13 +30,15 @@
|
|
|
30
30
|
"server"
|
|
31
31
|
],
|
|
32
32
|
"peerDependencies": {
|
|
33
|
-
"koishi": "^4.0.0-beta.
|
|
33
|
+
"koishi": "^4.0.0-beta.5"
|
|
34
34
|
},
|
|
35
35
|
"devDependencies": {
|
|
36
|
+
"@koishijs/plugin-mock": "^1.0.0-beta.1",
|
|
37
|
+
"@koishijs/test-utils": "^8.0.0-beta.5",
|
|
36
38
|
"@types/js-yaml": "^4.0.3",
|
|
37
39
|
"js-yaml": "^4.1.0"
|
|
38
40
|
},
|
|
39
41
|
"dependencies": {
|
|
40
|
-
"@koishijs/orm-utils": "^1.0.0-beta.
|
|
42
|
+
"@koishijs/orm-utils": "^1.0.0-beta.3"
|
|
41
43
|
}
|
|
42
44
|
}
|