@koishijs/plugin-database-mongo 3.0.0-beta.1 → 3.0.0-beta.2
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 +12 -0
- package/lib/index.js +7 -7
- package/lib/index.js.map +2 -2
- package/package.json +3 -3
package/lib/index.d.ts
CHANGED
|
@@ -54,6 +54,18 @@ declare namespace MongoDatabase {
|
|
|
54
54
|
password?: string;
|
|
55
55
|
database?: string;
|
|
56
56
|
prefix?: string;
|
|
57
|
+
} & {
|
|
58
|
+
[key: string]: any;
|
|
59
|
+
}, {
|
|
60
|
+
protocol?: string;
|
|
61
|
+
host?: string;
|
|
62
|
+
port?: number;
|
|
63
|
+
username?: string;
|
|
64
|
+
password?: string;
|
|
65
|
+
database?: string;
|
|
66
|
+
prefix?: string;
|
|
67
|
+
} & {
|
|
68
|
+
[key: string]: any;
|
|
57
69
|
}>;
|
|
58
70
|
}
|
|
59
71
|
export default MongoDatabase;
|
package/lib/index.js
CHANGED
|
@@ -166,13 +166,13 @@ __name(MongoDatabase, "MongoDatabase");
|
|
|
166
166
|
(function(MongoDatabase2) {
|
|
167
167
|
MongoDatabase2.name = "database-mongo";
|
|
168
168
|
MongoDatabase2.Config = import_koishi2.Schema.object({
|
|
169
|
-
protocol: import_koishi2.Schema.string("要使用的协议名。").default("mongodb"),
|
|
170
|
-
host: import_koishi2.Schema.string("要连接到的主机名。").default("localhost"),
|
|
171
|
-
port: import_koishi2.Schema.number("要连接到的端口号。"),
|
|
172
|
-
username: import_koishi2.Schema.string("要使用的用户名。"),
|
|
173
|
-
password: import_koishi2.Schema.string("要使用的密码。"),
|
|
174
|
-
database: import_koishi2.Schema.string("要访问的数据库名。").default("koishi"),
|
|
175
|
-
prefix: import_koishi2.Schema.string("使用的表名前缀。当配置了这一项时,所有通过 Koishi 创建的表名都会以这个配置项为前缀。")
|
|
169
|
+
protocol: import_koishi2.Schema.string().description("要使用的协议名。").default("mongodb"),
|
|
170
|
+
host: import_koishi2.Schema.string().description("要连接到的主机名。").default("localhost"),
|
|
171
|
+
port: import_koishi2.Schema.number().description("要连接到的端口号。"),
|
|
172
|
+
username: import_koishi2.Schema.string().description("要使用的用户名。"),
|
|
173
|
+
password: import_koishi2.Schema.string().description("要使用的密码。"),
|
|
174
|
+
database: import_koishi2.Schema.string().description("要访问的数据库名。").default("koishi"),
|
|
175
|
+
prefix: import_koishi2.Schema.string().description("使用的表名前缀。当配置了这一项时,所有通过 Koishi 创建的表名都会以这个配置项为前缀。")
|
|
176
176
|
});
|
|
177
177
|
})(MongoDatabase || (MongoDatabase = {}));
|
|
178
178
|
import_koishi2.Database.extend(MongoDatabase, {
|
package/lib/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/index.ts", "../src/utils.ts"],
|
|
4
|
-
"sourcesContent": ["import { MongoClient, Db, Collection } from 'mongodb'\nimport { Context, Channel, Database, User, Tables as KoishiTables, makeArray, Schema, valueMap, pick, omit, Query } from 'koishi'\nimport { URLSearchParams } from 'url'\nimport { createFilter, transformEval } from './utils'\n\ndeclare module 'koishi' {\n interface Database {\n mongo: MongoDatabase\n }\n\n interface Modules {\n 'database-mongo': typeof import('.')\n }\n}\n\ntype TableType = keyof Tables\n\nexport interface Tables extends KoishiTables {}\n\nclass MongoDatabase extends Database {\n public client: MongoClient\n public db: Db\n\n mongo = this\n\n user: Collection<User>\n channel: Collection<Channel>\n\n constructor(public ctx: Context, private config: MongoDatabase.Config) {\n super(ctx)\n }\n\n async start() {\n const mongourl = this.config.uri || this.connectionStringFromConfig()\n this.client = await MongoClient.connect(\n mongourl, { useNewUrlParser: true, useUnifiedTopology: true },\n )\n this.db = this.client.db(this.config.database)\n if (this.config.prefix) {\n this.db.collection = ((func, prefix) => function collection<T extends TableType>(name: T) {\n return func(`${prefix}.${name}`)\n })(this.db.collection.bind(this.db), this.config.prefix)\n }\n this.user = this.db.collection('user')\n this.channel = this.db.collection('channel')\n await this.channel.createIndex({ type: 1, pid: 1 }, { unique: true })\n\n for (const name in KoishiTables.config) {\n const { primary } = KoishiTables.config[name]\n const col = this.db.collection(name)\n await col.createIndex(Object.fromEntries(makeArray(primary).map(K => [K, 1])), { unique: true })\n }\n }\n\n collection<T extends TableType>(name: T): Collection<Tables[T]> {\n return this.db.collection(name)\n }\n\n stop() {\n return this.client.close()\n }\n\n connectionStringFromConfig() {\n const { authDatabase, connectOptions, host, database: name, password, port, protocol, username } = this.config\n let mongourl = `${protocol}://`\n if (username) mongourl += `${encodeURIComponent(username)}${password ? `:${encodeURIComponent(password)}` : ''}@`\n mongourl += `${host}${port ? `:${port}` : ''}/${authDatabase || name}`\n if (connectOptions) {\n const params = new URLSearchParams(connectOptions)\n mongourl += `?${params}`\n }\n return mongourl\n }\n}\n\nnamespace MongoDatabase {\n export const name = 'database-mongo'\n\n export interface Config {\n username?: string\n password?: string\n protocol?: string\n host?: string\n port?: number\n /** database name */\n database?: string\n prefix?: string\n /** default auth database */\n authDatabase?: string\n connectOptions?: ConstructorParameters<typeof URLSearchParams>[0]\n /** connection string (will overwrite all configs except 'name' and 'prefix') */\n uri?: string\n }\n\n export const Config = Schema.object({\n protocol: Schema.string('要使用的协议名。').default('mongodb'),\n host: Schema.string('要连接到的主机名。').default('localhost'),\n port: Schema.number('要连接到的端口号。'),\n username: Schema.string('要使用的用户名。'),\n password: Schema.string('要使用的密码。'),\n database: Schema.string('要访问的数据库名。').default('koishi'),\n prefix: Schema.string('使用的表名前缀。当配置了这一项时,所有通过 Koishi 创建的表名都会以这个配置项为前缀。'),\n })\n}\n\nDatabase.extend(MongoDatabase, {\n async drop(table) {\n if (table) {\n await this.db.collection(table).drop()\n } else {\n const collections = await this.db.collections()\n await Promise.all(collections.map(c => c.drop()))\n }\n },\n\n async get(name, query, modifier) {\n const filter = createFilter(name, query)\n let cursor = this.db.collection(name).find(filter)\n const { fields, limit, offset = 0 } = Query.resolveModifier(modifier)\n cursor = cursor.project({ _id: 0, ...Object.fromEntries((fields ?? []).map(key => [key, 1])) })\n if (offset) cursor = cursor.skip(offset)\n if (limit) cursor = cursor.limit(offset + limit)\n return await cursor.toArray()\n },\n\n async set(name, query, data) {\n const filter = createFilter(name, query)\n await this.db.collection(name).updateMany(filter, { $set: data })\n },\n\n async remove(name, query) {\n const filter = createFilter(name, query)\n await this.db.collection(name).deleteMany(filter)\n },\n\n async create(name, data: any) {\n const table = KoishiTables.config[name]\n const { primary, fields } = table\n if (!Array.isArray(primary) && table.autoInc && !(primary in data)) {\n const [latest] = await this.db.collection(name).find().sort(primary, -1).limit(1).toArray()\n data[primary] = latest ? latest[primary] + 1 : 1\n if (KoishiTables.Field.string.includes(fields[primary].type)) {\n data[primary] += ''\n }\n }\n const copy = { ...KoishiTables.create(name), ...data }\n try {\n await this.db.collection(name).insertOne(copy)\n return copy\n } catch {}\n },\n\n async upsert(name, data: any[], keys: string | string[]) {\n if (!data.length) return\n if (!keys) keys = KoishiTables.config[name].primary\n keys = makeArray(keys)\n const bulk = this.db.collection(name).initializeUnorderedBulkOp()\n for (const item of data) {\n bulk.find(pick(item, keys))\n .upsert()\n .updateOne({ $set: omit(item, keys), $setOnInsert: omit(KoishiTables.create(name), [...keys, ...Object.keys(item) as any]) })\n }\n await bulk.execute()\n },\n\n async aggregate(name, fields, query) {\n const $match = createFilter(name, query)\n const [data] = await this.db.collection(name).aggregate([{ $match }, {\n $group: {\n _id: 1,\n ...valueMap(fields, transformEval),\n },\n }]).toArray()\n return data\n },\n})\n\nexport default MongoDatabase\n", "import { TableType, Query, Eval, valueMap } from 'koishi'\nimport { QuerySelector } from 'mongodb'\n\nfunction transformFieldQuery(query: Query.FieldQuery, key: string) {\n // shorthand syntax\n if (typeof query === 'string' || typeof query === 'number' || query instanceof Date) {\n return { $eq: query }\n } else if (Array.isArray(query)) {\n if (!query.length) return\n return { $in: query }\n } else if (query instanceof RegExp) {\n return { $regex: query }\n }\n\n // query operators\n const result: QuerySelector<any> = {}\n for (const prop in query) {\n if (prop === '$el') {\n result.$elemMatch = transformFieldQuery(query[prop], key)\n } else if (prop === '$regexFor') {\n result.$expr = {\n body(data: string, value: string) {\n return new RegExp(data, 'i').test(value)\n },\n args: ['$' + key, query],\n lang: 'js',\n }\n } else {\n result[prop] = query[prop]\n }\n }\n return result\n}\n\nfunction transformQuery(query: Query.Expr) {\n const filter = {}\n for (const key in query) {\n const value = query[key]\n if (key === '$and' || key === '$or') {\n // MongoError: $and/$or/$nor must be a nonempty array\n if (value.length) {\n filter[key] = value.map(transformQuery)\n } else if (key === '$or') {\n return { $nor: [{}] }\n }\n } else if (key === '$not') {\n // MongoError: unknown top level operator: $not\n // https://stackoverflow.com/questions/25270396/mongodb-how-to-invert-query-with-not\n filter['$nor'] = [transformQuery(value)]\n } else if (key === '$expr') {\n filter[key] = transformEval(value)\n } else {\n filter[key] = transformFieldQuery(value, key)\n }\n }\n return filter\n}\n\nexport function createFilter<T extends TableType>(name: T, query: Query<T>) {\n return transformQuery(Query.resolve(name, query))\n}\n\nexport function transformEval(expr: Eval.Numeric | Eval.Aggregation) {\n if (typeof expr === 'string') {\n return '$' + expr\n } else if (typeof expr === 'number' || typeof expr === 'boolean') {\n return expr\n }\n\n return valueMap(expr as any, (value) => {\n if (Array.isArray(value)) {\n return value.map(transformEval)\n } else {\n return transformEval(value)\n }\n })\n}\n"],
|
|
5
|
-
"mappings": "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
|
|
4
|
+
"sourcesContent": ["import { MongoClient, Db, Collection } from 'mongodb'\nimport { Context, Channel, Database, User, Tables as KoishiTables, makeArray, Schema, valueMap, pick, omit, Query } from 'koishi'\nimport { URLSearchParams } from 'url'\nimport { createFilter, transformEval } from './utils'\n\ndeclare module 'koishi' {\n interface Database {\n mongo: MongoDatabase\n }\n\n interface Modules {\n 'database-mongo': typeof import('.')\n }\n}\n\ntype TableType = keyof Tables\n\nexport interface Tables extends KoishiTables {}\n\nclass MongoDatabase extends Database {\n public client: MongoClient\n public db: Db\n\n mongo = this\n\n user: Collection<User>\n channel: Collection<Channel>\n\n constructor(public ctx: Context, private config: MongoDatabase.Config) {\n super(ctx)\n }\n\n async start() {\n const mongourl = this.config.uri || this.connectionStringFromConfig()\n this.client = await MongoClient.connect(\n mongourl, { useNewUrlParser: true, useUnifiedTopology: true },\n )\n this.db = this.client.db(this.config.database)\n if (this.config.prefix) {\n this.db.collection = ((func, prefix) => function collection<T extends TableType>(name: T) {\n return func(`${prefix}.${name}`)\n })(this.db.collection.bind(this.db), this.config.prefix)\n }\n this.user = this.db.collection('user')\n this.channel = this.db.collection('channel')\n await this.channel.createIndex({ type: 1, pid: 1 }, { unique: true })\n\n for (const name in KoishiTables.config) {\n const { primary } = KoishiTables.config[name]\n const col = this.db.collection(name)\n await col.createIndex(Object.fromEntries(makeArray(primary).map(K => [K, 1])), { unique: true })\n }\n }\n\n collection<T extends TableType>(name: T): Collection<Tables[T]> {\n return this.db.collection(name)\n }\n\n stop() {\n return this.client.close()\n }\n\n connectionStringFromConfig() {\n const { authDatabase, connectOptions, host, database: name, password, port, protocol, username } = this.config\n let mongourl = `${protocol}://`\n if (username) mongourl += `${encodeURIComponent(username)}${password ? `:${encodeURIComponent(password)}` : ''}@`\n mongourl += `${host}${port ? `:${port}` : ''}/${authDatabase || name}`\n if (connectOptions) {\n const params = new URLSearchParams(connectOptions)\n mongourl += `?${params}`\n }\n return mongourl\n }\n}\n\nnamespace MongoDatabase {\n export const name = 'database-mongo'\n\n export interface Config {\n username?: string\n password?: string\n protocol?: string\n host?: string\n port?: number\n /** database name */\n database?: string\n prefix?: string\n /** default auth database */\n authDatabase?: string\n connectOptions?: ConstructorParameters<typeof URLSearchParams>[0]\n /** connection string (will overwrite all configs except 'name' and 'prefix') */\n uri?: string\n }\n\n export const Config = Schema.object({\n protocol: Schema.string().description('要使用的协议名。').default('mongodb'),\n host: Schema.string().description('要连接到的主机名。').default('localhost'),\n port: Schema.number().description('要连接到的端口号。'),\n username: Schema.string().description('要使用的用户名。'),\n password: Schema.string().description('要使用的密码。'),\n database: Schema.string().description('要访问的数据库名。').default('koishi'),\n prefix: Schema.string().description('使用的表名前缀。当配置了这一项时,所有通过 Koishi 创建的表名都会以这个配置项为前缀。'),\n })\n}\n\nDatabase.extend(MongoDatabase, {\n async drop(table) {\n if (table) {\n await this.db.collection(table).drop()\n } else {\n const collections = await this.db.collections()\n await Promise.all(collections.map(c => c.drop()))\n }\n },\n\n async get(name, query, modifier) {\n const filter = createFilter(name, query)\n let cursor = this.db.collection(name).find(filter)\n const { fields, limit, offset = 0 } = Query.resolveModifier(modifier)\n cursor = cursor.project({ _id: 0, ...Object.fromEntries((fields ?? []).map(key => [key, 1])) })\n if (offset) cursor = cursor.skip(offset)\n if (limit) cursor = cursor.limit(offset + limit)\n return await cursor.toArray()\n },\n\n async set(name, query, data) {\n const filter = createFilter(name, query)\n await this.db.collection(name).updateMany(filter, { $set: data })\n },\n\n async remove(name, query) {\n const filter = createFilter(name, query)\n await this.db.collection(name).deleteMany(filter)\n },\n\n async create(name, data: any) {\n const table = KoishiTables.config[name]\n const { primary, fields } = table\n if (!Array.isArray(primary) && table.autoInc && !(primary in data)) {\n const [latest] = await this.db.collection(name).find().sort(primary, -1).limit(1).toArray()\n data[primary] = latest ? latest[primary] + 1 : 1\n if (KoishiTables.Field.string.includes(fields[primary].type)) {\n data[primary] += ''\n }\n }\n const copy = { ...KoishiTables.create(name), ...data }\n try {\n await this.db.collection(name).insertOne(copy)\n return copy\n } catch {}\n },\n\n async upsert(name, data: any[], keys: string | string[]) {\n if (!data.length) return\n if (!keys) keys = KoishiTables.config[name].primary\n keys = makeArray(keys)\n const bulk = this.db.collection(name).initializeUnorderedBulkOp()\n for (const item of data) {\n bulk.find(pick(item, keys))\n .upsert()\n .updateOne({ $set: omit(item, keys), $setOnInsert: omit(KoishiTables.create(name), [...keys, ...Object.keys(item) as any]) })\n }\n await bulk.execute()\n },\n\n async aggregate(name, fields, query) {\n const $match = createFilter(name, query)\n const [data] = await this.db.collection(name).aggregate([{ $match }, {\n $group: {\n _id: 1,\n ...valueMap(fields, transformEval),\n },\n }]).toArray()\n return data\n },\n})\n\nexport default MongoDatabase\n", "import { TableType, Query, Eval, valueMap } from 'koishi'\nimport { QuerySelector } from 'mongodb'\n\nfunction transformFieldQuery(query: Query.FieldQuery, key: string) {\n // shorthand syntax\n if (typeof query === 'string' || typeof query === 'number' || query instanceof Date) {\n return { $eq: query }\n } else if (Array.isArray(query)) {\n if (!query.length) return\n return { $in: query }\n } else if (query instanceof RegExp) {\n return { $regex: query }\n }\n\n // query operators\n const result: QuerySelector<any> = {}\n for (const prop in query) {\n if (prop === '$el') {\n result.$elemMatch = transformFieldQuery(query[prop], key)\n } else if (prop === '$regexFor') {\n result.$expr = {\n body(data: string, value: string) {\n return new RegExp(data, 'i').test(value)\n },\n args: ['$' + key, query],\n lang: 'js',\n }\n } else {\n result[prop] = query[prop]\n }\n }\n return result\n}\n\nfunction transformQuery(query: Query.Expr) {\n const filter = {}\n for (const key in query) {\n const value = query[key]\n if (key === '$and' || key === '$or') {\n // MongoError: $and/$or/$nor must be a nonempty array\n if (value.length) {\n filter[key] = value.map(transformQuery)\n } else if (key === '$or') {\n return { $nor: [{}] }\n }\n } else if (key === '$not') {\n // MongoError: unknown top level operator: $not\n // https://stackoverflow.com/questions/25270396/mongodb-how-to-invert-query-with-not\n filter['$nor'] = [transformQuery(value)]\n } else if (key === '$expr') {\n filter[key] = transformEval(value)\n } else {\n filter[key] = transformFieldQuery(value, key)\n }\n }\n return filter\n}\n\nexport function createFilter<T extends TableType>(name: T, query: Query<T>) {\n return transformQuery(Query.resolve(name, query))\n}\n\nexport function transformEval(expr: Eval.Numeric | Eval.Aggregation) {\n if (typeof expr === 'string') {\n return '$' + expr\n } else if (typeof expr === 'number' || typeof expr === 'boolean') {\n return expr\n }\n\n return valueMap(expr as any, (value) => {\n if (Array.isArray(value)) {\n return value.map(transformEval)\n } else {\n return transformEval(value)\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-mongo",
|
|
3
3
|
"description": "MongoDB support for Koishi",
|
|
4
|
-
"version": "3.0.0-beta.
|
|
4
|
+
"version": "3.0.0-beta.2",
|
|
5
5
|
"main": "lib/index.js",
|
|
6
6
|
"typings": "lib/index.d.ts",
|
|
7
7
|
"files": [
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
],
|
|
10
10
|
"author": "undefined <masnn0@outlook.com>",
|
|
11
11
|
"maintainers": [
|
|
12
|
-
"Shigma <
|
|
12
|
+
"Shigma <shigma10826@gmail.com>",
|
|
13
13
|
"undefined <masnn0@outlook.com>"
|
|
14
14
|
],
|
|
15
15
|
"license": "MIT",
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
"mysql"
|
|
33
33
|
],
|
|
34
34
|
"peerDependencies": {
|
|
35
|
-
"koishi": "^4.0.0-beta.
|
|
35
|
+
"koishi": "^4.0.0-beta.3"
|
|
36
36
|
},
|
|
37
37
|
"dependencies": {
|
|
38
38
|
"@types/mongodb": "^3.6.12",
|