@koishijs/plugin-database-memory 2.5.1 → 3.0.0-alpha.0

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.cjs CHANGED
@@ -16,13 +16,12 @@ var __copyProps = (to, from, except, desc) => {
16
16
  };
17
17
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
18
18
 
19
- // koishi/plugins/database/memory/src/index.ts
19
+ // koishi/external/upstream/database/memory/src/index.ts
20
20
  var src_exports = {};
21
21
  __export(src_exports, {
22
22
  default: () => src_default
23
23
  });
24
24
  module.exports = __toCommonJS(src_exports);
25
- var import_koishi = require("koishi");
26
25
  var import_driver_memory = require("@minatojs/driver-memory");
27
- var src_default = (0, import_koishi.defineDriver)(import_driver_memory.MemoryDriver, import_koishi.Schema.object({}));
26
+ var src_default = import_driver_memory.MemoryDriver;
28
27
  //# sourceMappingURL=index.cjs.map
package/lib/index.cjs.map CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/index.ts"],
4
- "mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAAqC;AACrC,2BAA6B;AAE7B,IAAO,kBAAQ,4BAAa,mCAAc,qBAAO,OAAO,CAAC,CAAC,CAAC;",
4
+ "mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2BAA6B;AAE7B,IAAO,cAAQ;",
5
5
  "names": []
6
6
  }
package/lib/index.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- declare const _default: Plugin.Object<import("koishi").Context, T>;
2
- export default _default;
1
+ import { MemoryDriver } from '@minatojs/driver-memory';
2
+ export default MemoryDriver;
package/lib/index.mjs CHANGED
@@ -1,7 +1,6 @@
1
- // koishi/plugins/database/memory/src/index.ts
2
- import { defineDriver, Schema } from "koishi";
1
+ // koishi/external/upstream/database/memory/src/index.ts
3
2
  import { MemoryDriver } from "@minatojs/driver-memory";
4
- var src_default = defineDriver(MemoryDriver, Schema.object({}));
3
+ var src_default = MemoryDriver;
5
4
  export {
6
5
  src_default as default
7
6
  };
package/lib/index.mjs.map CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/index.ts"],
4
- "mappings": ";AAAA,SAAS,cAAc,cAAc;AACrC,SAAS,oBAAoB;AAE7B,IAAO,cAAQ,aAAa,cAAc,OAAO,OAAO,CAAC,CAAC,CAAC;",
4
+ "mappings": ";AAAA,SAAS,oBAAoB;AAE7B,IAAO,cAAQ;",
5
5
  "names": []
6
6
  }
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": "2.5.1",
4
+ "version": "3.0.0-alpha.0",
5
5
  "main": "lib/index.cjs",
6
6
  "module": "lib/index.mjs",
7
7
  "typings": "lib/index.d.ts",
@@ -43,12 +43,12 @@
43
43
  }
44
44
  },
45
45
  "peerDependencies": {
46
- "koishi": "^4.16.0"
46
+ "koishi": "^4.17.0-alpha.0"
47
47
  },
48
48
  "devDependencies": {
49
- "koishi": "^4.16.0"
49
+ "koishi": "^4.17.0-alpha.0"
50
50
  },
51
51
  "dependencies": {
52
- "@minatojs/driver-memory": "^2.5.1"
52
+ "@minatojs/driver-memory": "^3.0.0-alpha.0"
53
53
  }
54
54
  }
package/src/index.ts CHANGED
@@ -1,4 +1,3 @@
1
- import { defineDriver, Schema } from 'koishi'
2
1
  import { MemoryDriver } from '@minatojs/driver-memory'
3
2
 
4
- export default defineDriver(MemoryDriver, Schema.object({}))
3
+ export default MemoryDriver
package/lib/browser.js DELETED
@@ -1 +0,0 @@
1
- import{defineDriver as r,Schema as e}from"koishi";import o from"@minatojs/driver-memory";var t=r(o,e.object({}));export{t as default};
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/index.ts", "../src/storage/browser.ts"],
4
- "sourcesContent": ["import { clone, Context, Database, Dict, KoishiError, makeArray, Model, noop, pick, Query, TableType } from 'koishi'\nimport { executeEval, executeQuery, executeSort, executeUpdate } from '@koishijs/orm-utils'\nimport { Config, Storage } 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\n #store: Dict<any[]> = {}\n #loader: Storage\n\n constructor(public ctx: Context, public config: Config = {}) {\n super(ctx)\n\n if (config.storage) {\n this.#loader = new Storage(ctx, config)\n }\n }\n\n async start() {\n await this.#loader?.start(this.#store)\n }\n\n async $save(name: string) {\n await this.#loader?.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() {\n this.#store = {}\n await this.#loader?.drop()\n }\n\n async stats() {\n return {}\n }\n\n $query(name: TableType, query: Query) {\n const expr = this.ctx.model.resolveQuery(name, query)\n return this.$table(name).filter(row => executeQuery(row, expr))\n }\n\n async get(name: TableType, query: Query, modifier?: Query.Modifier) {\n const { fields, limit = Infinity, offset = 0, sort = {} } = Query.resolveModifier(modifier)\n return executeSort(this.$query(name, query), sort)\n .map(row => clone(pick(row, fields)))\n .slice(offset, offset + limit)\n }\n\n async set(name: TableType, query: Query, data: {}) {\n this.$query(name, query).forEach(row => executeUpdate(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(row, expr))\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) {\n throw new KoishiError('duplicate entry', 'database.duplicate-entry')\n }\n }\n const copy = { ...this.ctx.model.create(name), ...data }\n store.push(copy)\n this.$save(name)\n return clone(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 executeUpdate(row, item)\n } else {\n const data = this.ctx.model.create(name)\n await this.create(name, executeUpdate(data, item)).catch(noop)\n }\n }\n this.$save(name)\n }\n\n async eval(name: TableType, expr: any, query: Query) {\n const table = this.$query(name, query)\n return executeEval(table, expr)\n }\n}\n\nexport default MemoryDatabase\n", "import { Context } from 'koishi'\n\nexport interface Config {\n prefix?: string\n}\n\nexport class Storage {\n constructor(ctx: Context, private config: Config) {\n config.prefix ||= 'koishi.database.'\n }\n\n async start(tables: Record<string, any[]>) {\n for (const key in localStorage) {\n if (!key.startsWith(this.config.prefix)) break\n const buffer = localStorage.getItem(key)\n if (!buffer) return\n try {\n const data = JSON.parse(buffer)\n tables[key.slice(this.config.prefix.length)] = data\n } catch {}\n }\n }\n\n async drop(name?: string) {\n if (name) {\n localStorage.removeItem(this.config.prefix + name)\n return\n }\n\n for (const key in localStorage) {\n if (key.startsWith(this.config.prefix)) {\n localStorage.removeItem(key)\n }\n }\n }\n\n async save(name: string, table: any[]) {\n try {\n const buffer = JSON.stringify(table)\n localStorage.setItem(this.config.prefix + name, buffer)\n } catch {}\n }\n}\n"],
5
- "mappings": "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",
6
- "names": []
7
- }
package/lib/index.js DELETED
@@ -1,233 +0,0 @@
1
- var __create = Object.create;
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __getOwnPropSymbols = Object.getOwnPropertySymbols;
6
- var __getProtoOf = Object.getPrototypeOf;
7
- var __hasOwnProp = Object.prototype.hasOwnProperty;
8
- var __propIsEnum = Object.prototype.propertyIsEnumerable;
9
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
10
- var __spreadValues = (a, b) => {
11
- for (var prop in b || (b = {}))
12
- if (__hasOwnProp.call(b, prop))
13
- __defNormalProp(a, prop, b[prop]);
14
- if (__getOwnPropSymbols)
15
- for (var prop of __getOwnPropSymbols(b)) {
16
- if (__propIsEnum.call(b, prop))
17
- __defNormalProp(a, prop, b[prop]);
18
- }
19
- return a;
20
- };
21
- var __markAsModule = (target) => __defProp(target, "__esModule", { value: true });
22
- var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
23
- var __export = (target, all) => {
24
- __markAsModule(target);
25
- for (var name in all)
26
- __defProp(target, name, { get: all[name], enumerable: true });
27
- };
28
- var __reExport = (target, module2, desc) => {
29
- if (module2 && typeof module2 === "object" || typeof module2 === "function") {
30
- for (let key of __getOwnPropNames(module2))
31
- if (!__hasOwnProp.call(target, key) && key !== "default")
32
- __defProp(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable });
33
- }
34
- return target;
35
- };
36
- var __toModule = (module2) => {
37
- return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? { get: () => module2.default, enumerable: true } : { value: module2, enumerable: true })), module2);
38
- };
39
- var __accessCheck = (obj, member, msg) => {
40
- if (!member.has(obj))
41
- throw TypeError("Cannot " + msg);
42
- };
43
- var __privateGet = (obj, member, getter) => {
44
- __accessCheck(obj, member, "read from private field");
45
- return getter ? getter.call(obj) : member.get(obj);
46
- };
47
- var __privateAdd = (obj, member, value) => {
48
- if (member.has(obj))
49
- throw TypeError("Cannot add the same private member more than once");
50
- member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
51
- };
52
- var __privateSet = (obj, member, value, setter) => {
53
- __accessCheck(obj, member, "write to private field");
54
- setter ? setter.call(obj, value) : member.set(obj, value);
55
- return value;
56
- };
57
-
58
- // plugins/database/memory/src/index.ts
59
- __export(exports, {
60
- MemoryDatabase: () => MemoryDatabase,
61
- default: () => src_default
62
- });
63
- var import_koishi = __toModule(require("koishi"));
64
- var import_orm_utils = __toModule(require("@koishijs/orm-utils"));
65
-
66
- // plugins/database/memory/src/storage/node.ts
67
- var import_fs = __toModule(require("fs"));
68
- var import_path = __toModule(require("path"));
69
- var loaders = ["json", "yaml", "yml"];
70
- var Storage = class {
71
- constructor(ctx, config) {
72
- this.config = config;
73
- config.loader || (config.loader = "json");
74
- config.root || (config.root = (0, import_path.resolve)(ctx.app.options.baseDir, ".koishi/database"));
75
- if (!loaders.includes(config.loader)) {
76
- throw new Error(`unsupported loader "${config.loader}"`);
77
- }
78
- }
79
- async start(tables) {
80
- const { root, loader } = this.config;
81
- await import_fs.promises.mkdir(root, { recursive: true });
82
- const files = await import_fs.promises.readdir(root);
83
- await Promise.all(files.map(async (filename) => {
84
- const extension = (0, import_path.extname)(filename);
85
- if (extension !== loader)
86
- return;
87
- const buffer = await import_fs.promises.readFile(filename);
88
- try {
89
- const data = await this.load(buffer, loader);
90
- const name = filename.slice(0, -1 - extension.length);
91
- tables[name] = data;
92
- } catch {
93
- }
94
- }));
95
- }
96
- async load(buffer, loader) {
97
- if (loader === "json") {
98
- return JSON.parse(buffer.toString());
99
- } else if (loader === "yaml" || loader === "yml") {
100
- const { load } = require("js-yaml");
101
- return load(buffer.toString());
102
- }
103
- }
104
- async drop(name) {
105
- const { root, loader } = this.config;
106
- if (name) {
107
- await import_fs.promises.rm((0, import_path.resolve)(root, `${name}.${loader}`));
108
- } else {
109
- await import_fs.promises.rm(root, { recursive: true, force: true });
110
- }
111
- }
112
- async save(name, table) {
113
- const { root, loader } = this.config;
114
- try {
115
- const buffer = await this.dump(table, loader);
116
- await import_fs.promises.writeFile((0, import_path.resolve)(root, `${name}.${loader}`), buffer);
117
- } catch {
118
- }
119
- }
120
- async dump(data, loader) {
121
- if (loader === "json") {
122
- return JSON.stringify(data);
123
- } else if (loader === "yaml" || loader === "yml") {
124
- const { dump } = require("js-yaml");
125
- return dump(data);
126
- }
127
- }
128
- };
129
- __name(Storage, "Storage");
130
-
131
- // plugins/database/memory/src/index.ts
132
- var _store, _loader;
133
- var MemoryDatabase = class extends import_koishi.Database {
134
- constructor(ctx, config = {}) {
135
- super(ctx);
136
- this.ctx = ctx;
137
- this.config = config;
138
- this.memory = this;
139
- __privateAdd(this, _store, {});
140
- __privateAdd(this, _loader, void 0);
141
- if (config.storage) {
142
- __privateSet(this, _loader, new Storage(ctx, config));
143
- }
144
- }
145
- async start() {
146
- var _a;
147
- await ((_a = __privateGet(this, _loader)) == null ? void 0 : _a.start(__privateGet(this, _store)));
148
- }
149
- async $save(name) {
150
- var _a;
151
- await ((_a = __privateGet(this, _loader)) == null ? void 0 : _a.save(name, __privateGet(this, _store)[name]));
152
- }
153
- stop() {
154
- }
155
- $table(table) {
156
- var _a;
157
- return (_a = __privateGet(this, _store))[table] || (_a[table] = []);
158
- }
159
- async drop() {
160
- var _a;
161
- __privateSet(this, _store, {});
162
- await ((_a = __privateGet(this, _loader)) == null ? void 0 : _a.drop());
163
- }
164
- async stats() {
165
- return {};
166
- }
167
- $query(name, query) {
168
- const expr = this.ctx.model.resolveQuery(name, query);
169
- return this.$table(name).filter((row) => (0, import_orm_utils.executeQuery)(row, expr));
170
- }
171
- async get(name, query, modifier) {
172
- const { fields, limit = Infinity, offset = 0, sort = {} } = import_koishi.Query.resolveModifier(modifier);
173
- return (0, import_orm_utils.executeSort)(this.$query(name, query), sort).map((row) => (0, import_koishi.clone)((0, import_koishi.pick)(row, fields))).slice(offset, offset + limit);
174
- }
175
- async set(name, query, data) {
176
- this.$query(name, query).forEach((row) => (0, import_orm_utils.executeUpdate)(row, data));
177
- this.$save(name);
178
- }
179
- async remove(name, query) {
180
- const expr = this.ctx.model.resolveQuery(name, query);
181
- __privateGet(this, _store)[name] = this.$table(name).filter((row) => !(0, import_orm_utils.executeQuery)(row, expr));
182
- this.$save(name);
183
- }
184
- async create(name, data) {
185
- const store = this.$table(name);
186
- const { primary, fields, autoInc } = this.ctx.model.config[name];
187
- data = (0, import_koishi.clone)(data);
188
- if (!Array.isArray(primary) && autoInc && !(primary in data)) {
189
- const max = store.length ? Math.max(...store.map((row) => +row[primary])) : 0;
190
- data[primary] = max + 1;
191
- if (import_koishi.Model.Field.string.includes(fields[primary].type)) {
192
- data[primary] += "";
193
- }
194
- } else {
195
- const duplicated = await this.get(name, (0, import_koishi.pick)(data, (0, import_koishi.makeArray)(primary)));
196
- if (duplicated.length) {
197
- throw new import_koishi.KoishiError("duplicate entry", "database.duplicate-entry");
198
- }
199
- }
200
- const copy = __spreadValues(__spreadValues({}, this.ctx.model.create(name)), data);
201
- store.push(copy);
202
- this.$save(name);
203
- return (0, import_koishi.clone)(copy);
204
- }
205
- async upsert(name, data, key) {
206
- const keys = (0, import_koishi.makeArray)(key || this.ctx.model.config[name].primary);
207
- for (const item of data) {
208
- const row = this.$table(name).find((row2) => {
209
- return keys.every((key2) => row2[key2] === item[key2]);
210
- });
211
- if (row) {
212
- (0, import_orm_utils.executeUpdate)(row, item);
213
- } else {
214
- const data2 = this.ctx.model.create(name);
215
- await this.create(name, (0, import_orm_utils.executeUpdate)(data2, item)).catch(import_koishi.noop);
216
- }
217
- }
218
- this.$save(name);
219
- }
220
- async aggregate(name, fields, query) {
221
- const table = this.$query(name, query);
222
- return (0, import_koishi.valueMap)(fields, (value) => (0, import_orm_utils.executeEval)(table, value));
223
- }
224
- };
225
- __name(MemoryDatabase, "MemoryDatabase");
226
- _store = new WeakMap();
227
- _loader = new WeakMap();
228
- var src_default = MemoryDatabase;
229
- // Annotate the CommonJS export names for ESM import in node:
230
- 0 && (module.exports = {
231
- MemoryDatabase
232
- });
233
- //# sourceMappingURL=index.js.map
package/lib/index.js.map DELETED
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/index.ts", "../src/storage/node.ts"],
4
- "sourcesContent": ["import { Context, Database, Query, TableType, clone, makeArray, pick, Dict, valueMap, Model, noop, KoishiError } from 'koishi'\nimport { executeQuery, executeEval, executeUpdate, executeSort } 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\n #store: Dict<any[]> = {}\n #loader: Storage\n\n constructor(public ctx: Context, public config: Config = {}) {\n super(ctx)\n\n if (config.storage) {\n this.#loader = new Storage(ctx, config)\n }\n }\n\n async start() {\n await this.#loader?.start(this.#store)\n }\n\n async $save(name: string) {\n await this.#loader?.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() {\n this.#store = {}\n await this.#loader?.drop()\n }\n\n async stats() {\n return {}\n }\n\n $query(name: TableType, query: Query) {\n const expr = this.ctx.model.resolveQuery(name, query)\n return this.$table(name).filter(row => executeQuery(row, expr))\n }\n\n async get(name: TableType, query: Query, modifier?: Query.Modifier) {\n const { fields, limit = Infinity, offset = 0, sort = {} } = Query.resolveModifier(modifier)\n return executeSort(this.$query(name, query), sort)\n .map(row => clone(pick(row, fields)))\n .slice(offset, offset + limit)\n }\n\n async set(name: TableType, query: Query, data: {}) {\n this.$query(name, query).forEach(row => executeUpdate(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(row, expr))\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) {\n throw new KoishiError('duplicate entry', 'database.duplicate-entry')\n }\n }\n const copy = { ...this.ctx.model.create(name), ...data }\n store.push(copy)\n this.$save(name)\n return clone(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 executeUpdate(row, item)\n } else {\n const data = this.ctx.model.create(name)\n await this.create(name, executeUpdate(data, item)).catch(noop)\n }\n }\n this.$save(name)\n }\n\n async aggregate(name: TableType, fields: {}, query: Query) {\n const table = this.$query(name, query)\n return valueMap(fields, value => executeEval(table, value)) 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": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA,oBAAsH;AACtH,uBAAsE;;;ACCtE,gBAA+B;AAC/B,kBAAiC;AAGjC,IAAM,UAAU,CAAC,QAAQ,QAAQ;AAO1B,oBAAc;AAAA,EACnB,YAAY,KAAsB,QAAgB;AAAhB;AAChC,WAAO,UAAP,QAAO,SAAW;AAClB,WAAO,QAAP,QAAO,OAAS,yBAAQ,IAAI,IAAI,QAAQ,SAAS;AACjD,QAAI,CAAC,QAAQ,SAAS,OAAO,SAAS;AACpC,YAAM,IAAI,MAAM,uBAAuB,OAAO;AAAA;AAAA;AAAA,QAI5C,MAAM,QAA+B;AACzC,UAAM,EAAE,MAAM,WAAW,KAAK;AAC9B,UAAM,mBAAG,MAAM,MAAM,EAAE,WAAW;AAClC,UAAM,QAAQ,MAAM,mBAAG,QAAQ;AAC/B,UAAM,QAAQ,IAAI,MAAM,IAAI,OAAO,aAAa;AAC9C,YAAM,YAAY,yBAAQ;AAC1B,UAAI,cAAc;AAAQ;AAC1B,YAAM,SAAS,MAAM,mBAAG,SAAS;AACjC,UAAI;AACF,cAAM,OAAO,MAAM,KAAK,KAAK,QAAQ;AACrC,cAAM,OAAO,SAAS,MAAM,GAAG,KAAK,UAAU;AAC9C,eAAO,QAAQ;AAAA,cACf;AAAA;AAAA;AAAA;AAAA,QAIA,KAAK,QAAgB,QAAgB;AACzC,QAAI,WAAW,QAAQ;AACrB,aAAO,KAAK,MAAM,OAAO;AAAA,eAChB,WAAW,UAAU,WAAW,OAAO;AAChD,YAAM,EAAE,SAAS,QAAQ;AACzB,aAAO,KAAK,OAAO;AAAA;AAAA;AAAA,QAIjB,KAAK,MAAe;AACxB,UAAM,EAAE,MAAM,WAAW,KAAK;AAC9B,QAAI,MAAM;AACR,YAAM,mBAAG,GAAG,yBAAQ,MAAM,GAAG,QAAQ;AAAA,WAChC;AACL,YAAM,mBAAG,GAAG,MAAM,EAAE,WAAW,MAAM,OAAO;AAAA;AAAA;AAAA,QAI1C,KAAK,MAAc,OAAc;AACrC,UAAM,EAAE,MAAM,WAAW,KAAK;AAC9B,QAAI;AACF,YAAM,SAAS,MAAM,KAAK,KAAK,OAAO;AACtC,YAAM,mBAAG,UAAU,yBAAQ,MAAM,GAAG,QAAQ,WAAW;AAAA,YACvD;AAAA;AAAA;AAAA,QAGE,KAAK,MAAW,QAAgB;AACpC,QAAI,WAAW,QAAQ;AACrB,aAAO,KAAK,UAAU;AAAA,eACb,WAAW,UAAU,WAAW,OAAO;AAChD,YAAM,EAAE,SAAS,QAAQ;AACzB,aAAO,KAAK;AAAA;AAAA;AAAA;AAxDX;;;ADbP;AAcO,mCAA6B,uBAAS;AAAA,EAM3C,YAAmB,KAAqB,SAAiB,IAAI;AAC3D,UAAM;AADW;AAAqB;AALjC,kBAAS;AAEhB,+BAAsB;AACtB;AAKE,QAAI,OAAO,SAAS;AAClB,yBAAK,SAAU,IAAI,QAAQ,KAAK;AAAA;AAAA;AAAA,QAI9B,QAAQ;AA5BhB;AA6BI,UAAM,0BAAK,aAAL,mBAAc,MAAM,mBAAK;AAAA;AAAA,QAG3B,MAAM,MAAc;AAhC5B;AAiCI,UAAM,0BAAK,aAAL,mBAAc,KAAK,MAAM,mBAAK,QAAO;AAAA;AAAA,EAG7C,OAAO;AAAA;AAAA,EAEP,OAA4B,OAAU;AAtCxC;AAuCI,WAAO,yBAAK,SAAL,uBAAuB;AAAA;AAAA,QAG1B,OAAO;AA1Cf;AA2CI,uBAAK,QAAS;AACd,UAAM,0BAAK,aAAL,mBAAc;AAAA;AAAA,QAGhB,QAAQ;AACZ,WAAO;AAAA;AAAA,EAGT,OAAO,MAAiB,OAAc;AACpC,UAAM,OAAO,KAAK,IAAI,MAAM,aAAa,MAAM;AAC/C,WAAO,KAAK,OAAO,MAAM,OAAO,SAAO,mCAAa,KAAK;AAAA;AAAA,QAGrD,IAAI,MAAiB,OAAc,UAA2B;AAClE,UAAM,EAAE,QAAQ,QAAQ,UAAU,SAAS,GAAG,OAAO,OAAO,oBAAM,gBAAgB;AAClF,WAAO,kCAAY,KAAK,OAAO,MAAM,QAAQ,MAC1C,IAAI,SAAO,yBAAM,wBAAK,KAAK,UAC3B,MAAM,QAAQ,SAAS;AAAA;AAAA,QAGtB,IAAI,MAAiB,OAAc,MAAU;AACjD,SAAK,OAAO,MAAM,OAAO,QAAQ,SAAO,oCAAc,KAAK;AAC3D,SAAK,MAAM;AAAA;AAAA,QAGP,OAAO,MAAiB,OAAc;AAC1C,UAAM,OAAO,KAAK,IAAI,MAAM,aAAa,MAAM;AAC/C,uBAAK,QAAO,QAAQ,KAAK,OAAO,MAC7B,OAAO,SAAO,CAAC,mCAAa,KAAK;AACpC,SAAK,MAAM;AAAA;AAAA,QAGP,OAAO,MAAiB,MAAW;AACvC,UAAM,QAAQ,KAAK,OAAO;AAC1B,UAAM,EAAE,SAAS,QAAQ,YAAY,KAAK,IAAI,MAAM,OAAO;AAC3D,WAAO,yBAAM;AACb,QAAI,CAAC,MAAM,QAAQ,YAAY,WAAW,CAAE,YAAW,OAAO;AAC5D,YAAM,MAAM,MAAM,SAAS,KAAK,IAAI,GAAG,MAAM,IAAI,SAAO,CAAC,IAAI,aAAa;AAC1E,WAAK,WAAW,MAAM;AACtB,UAAI,oBAAM,MAAM,OAAO,SAAS,OAAO,SAAS,OAAO;AACrD,aAAK,YAAY;AAAA;AAAA,WAEd;AACL,YAAM,aAAa,MAAM,KAAK,IAAI,MAAM,wBAAK,MAAM,6BAAU;AAC7D,UAAI,WAAW,QAAQ;AACrB,cAAM,IAAI,0BAAY,mBAAmB;AAAA;AAAA;AAG7C,UAAM,OAAO,kCAAK,KAAK,IAAI,MAAM,OAAO,QAAU;AAClD,UAAM,KAAK;AACX,SAAK,MAAM;AACX,WAAO,yBAAM;AAAA;AAAA,QAGT,OAAO,MAAiB,MAAa,KAAwB;AACjE,UAAM,OAAO,6BAAU,OAAO,KAAK,IAAI,MAAM,OAAO,MAAM;AAC1D,eAAW,QAAQ,MAAM;AACvB,YAAM,MAAM,KAAK,OAAO,MAAM,KAAK,UAAO;AACxC,eAAO,KAAK,MAAM,UAAO,KAAI,UAAS,KAAK;AAAA;AAE7C,UAAI,KAAK;AACP,4CAAc,KAAK;AAAA,aACd;AACL,cAAM,QAAO,KAAK,IAAI,MAAM,OAAO;AACnC,cAAM,KAAK,OAAO,MAAM,oCAAc,OAAM,OAAO,MAAM;AAAA;AAAA;AAG7D,SAAK,MAAM;AAAA;AAAA,QAGP,UAAU,MAAiB,QAAY,OAAc;AACzD,UAAM,QAAQ,KAAK,OAAO,MAAM;AAChC,WAAO,4BAAS,QAAQ,WAAS,kCAAY,OAAO;AAAA;AAAA;AArGjD;AAGL;AACA;AAqGF,IAAO,cAAQ;",
6
- "names": []
7
- }
package/lib/node.js DELETED
@@ -1,33 +0,0 @@
1
- var __create = Object.create;
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __getProtoOf = Object.getPrototypeOf;
6
- var __hasOwnProp = Object.prototype.hasOwnProperty;
7
- var __export = (target, all) => {
8
- for (var name in all)
9
- __defProp(target, name, { get: all[name], enumerable: true });
10
- };
11
- var __copyProps = (to, from, except, desc) => {
12
- if (from && typeof from === "object" || typeof from === "function") {
13
- for (let key of __getOwnPropNames(from))
14
- if (!__hasOwnProp.call(to, key) && key !== except)
15
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
- }
17
- return to;
18
- };
19
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod));
20
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
21
-
22
- // plugins/database/memory/src/index.ts
23
- var src_exports = {};
24
- __export(src_exports, {
25
- default: () => src_default
26
- });
27
- module.exports = __toCommonJS(src_exports);
28
- var import_koishi = require("koishi");
29
- var import_driver_memory = __toESM(require("@minatojs/driver-memory"));
30
- var src_default = (0, import_koishi.defineDriver)(import_driver_memory.default, import_koishi.Schema.object({}));
31
- // Annotate the CommonJS export names for ESM import in node:
32
- 0 && (module.exports = {});
33
- //# sourceMappingURL=node.js.map
package/lib/node.js.map DELETED
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/index.ts"],
4
- "sourcesContent": ["import { defineDriver, Schema } from 'koishi'\nimport MemoryDriver from '@minatojs/driver-memory'\n\nexport default defineDriver(MemoryDriver, Schema.object({}))\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAAqC;AACrC,2BAAyB;AAEzB,IAAO,cAAQ,gCAAa,8BAAc,qBAAO,OAAO,CAAC,CAAC,CAAC;",
6
- "names": []
7
- }
@@ -1,11 +0,0 @@
1
- import { Context } from 'koishi';
2
- export interface Config {
3
- prefix?: string;
4
- }
5
- export declare class Storage {
6
- private config;
7
- constructor(ctx: Context, config: Config);
8
- start(tables: Record<string, any[]>): Promise<void>;
9
- drop(name?: string): Promise<void>;
10
- save(name: string, table: any[]): Promise<void>;
11
- }
@@ -1,13 +0,0 @@
1
- import { Context } from 'koishi';
2
- export declare class Storage {
3
- constructor(ctx: Context, config: Config);
4
- start(tables: Record<string, any[]>): Promise<void>;
5
- save(name: string, table: any[]): Promise<void>;
6
- drop(name?: string): Promise<void>;
7
- }
8
- export interface Config {
9
- storage?: boolean;
10
- loader?: 'json' | 'yaml' | 'yml';
11
- root?: string;
12
- prefix?: string;
13
- }
@@ -1,17 +0,0 @@
1
- /// <reference types="node" />
2
- import { Context } from 'koishi';
3
- declare type Loader = 'json' | 'yaml' | 'yml';
4
- export interface Config {
5
- loader?: Loader;
6
- root?: string;
7
- }
8
- export declare class Storage {
9
- private config;
10
- constructor(ctx: Context, config: Config);
11
- start(tables: Record<string, any[]>): Promise<void>;
12
- load(buffer: Buffer, loader: Loader): Promise<any>;
13
- drop(name?: string): Promise<void>;
14
- save(name: string, table: any[]): Promise<void>;
15
- dump(data: any, loader: Loader): Promise<string>;
16
- }
17
- export {};