@book000/pixivts-db-mysql 0.60.0 → 0.60.1
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/dist/index.cjs +266 -136
- package/dist/index.d.cts +287 -309
- package/dist/index.d.cts.map +1 -0
- package/dist/index.d.ts +287 -309
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +237 -131
- package/dist/index.js.map +1 -0
- package/dist/rolldown-runtime-D7D4PA-g.js +13 -0
- package/package.json +4 -4
package/dist/index.cjs
CHANGED
|
@@ -1,87 +1,146 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
var
|
|
4
|
-
var mysql = require('mysql2/promise');
|
|
5
|
-
var mysqlCore = require('drizzle-orm/mysql-core');
|
|
6
|
-
var crypto = require('crypto');
|
|
7
|
-
var drizzleOrm = require('drizzle-orm');
|
|
8
|
-
|
|
9
|
-
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
10
|
-
|
|
11
|
-
var mysql__default = /*#__PURE__*/_interopDefault(mysql);
|
|
12
|
-
var crypto__default = /*#__PURE__*/_interopDefault(crypto);
|
|
13
|
-
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
//#region \0rolldown/runtime.js
|
|
3
|
+
var __create = Object.create;
|
|
14
4
|
var __defProp = Object.defineProperty;
|
|
15
|
-
var
|
|
16
|
-
|
|
17
|
-
|
|
5
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
6
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
7
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
8
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
9
|
+
var __exportAll = (all, no_symbols) => {
|
|
10
|
+
let target = {};
|
|
11
|
+
for (var name in all) __defProp(target, name, {
|
|
12
|
+
get: all[name],
|
|
13
|
+
enumerable: true
|
|
14
|
+
});
|
|
15
|
+
if (!no_symbols) __defProp(target, Symbol.toStringTag, { value: "Module" });
|
|
16
|
+
return target;
|
|
18
17
|
};
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
)
|
|
62
|
-
|
|
63
|
-
|
|
18
|
+
var __copyProps = (to, from, except, desc) => {
|
|
19
|
+
if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
|
|
20
|
+
key = keys[i];
|
|
21
|
+
if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
|
|
22
|
+
get: ((k) => from[k]).bind(null, key),
|
|
23
|
+
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
return to;
|
|
27
|
+
};
|
|
28
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
|
|
29
|
+
value: mod,
|
|
30
|
+
enumerable: true
|
|
31
|
+
}) : target, mod));
|
|
32
|
+
//#endregion
|
|
33
|
+
let drizzle_orm_mysql2 = require("drizzle-orm/mysql2");
|
|
34
|
+
let mysql2_promise = require("mysql2/promise");
|
|
35
|
+
mysql2_promise = __toESM(mysql2_promise, 1);
|
|
36
|
+
let drizzle_orm_mysql_core = require("drizzle-orm/mysql-core");
|
|
37
|
+
let node_crypto = require("node:crypto");
|
|
38
|
+
node_crypto = __toESM(node_crypto, 1);
|
|
39
|
+
let drizzle_orm = require("drizzle-orm");
|
|
40
|
+
//#region src/schema.ts
|
|
41
|
+
/**
|
|
42
|
+
* Drizzle ORM schema for the `responses` table.
|
|
43
|
+
*
|
|
44
|
+
* Column names are kept in snake_case to match the legacy TypeORM schema
|
|
45
|
+
* so that existing databases can be used without migration.
|
|
46
|
+
*/
|
|
47
|
+
var schema_exports = /* @__PURE__ */ __exportAll({ responsesTable: () => responsesTable });
|
|
48
|
+
/**
|
|
49
|
+
* The `responses` table stores every HTTP response returned by the pixiv API.
|
|
50
|
+
*
|
|
51
|
+
* A unique composite index on (method, endpoint, status_code, url_hash) ensures
|
|
52
|
+
* that each unique request/response combination is stored only once, regardless
|
|
53
|
+
* of when it was recorded.
|
|
54
|
+
*/
|
|
55
|
+
const responsesTable = (0, drizzle_orm_mysql_core.mysqlTable)("responses", {
|
|
56
|
+
/** Auto-increment primary key. */
|
|
57
|
+
id: (0, drizzle_orm_mysql_core.int)("id").autoincrement().primaryKey(),
|
|
58
|
+
/** HTTP method (GET or POST). */
|
|
59
|
+
method: (0, drizzle_orm_mysql_core.varchar)("method", { length: 10 }).notNull(),
|
|
60
|
+
/** API endpoint path (e.g. /v1/illust/detail). */
|
|
61
|
+
endpoint: (0, drizzle_orm_mysql_core.varchar)("endpoint", { length: 255 }).notNull(),
|
|
62
|
+
/** Full request URL (may be null for internal requests). */
|
|
63
|
+
url: (0, drizzle_orm_mysql_core.text)("url"),
|
|
64
|
+
/** SHA-256 hash of the request URL for deduplication. */
|
|
65
|
+
urlHash: (0, drizzle_orm_mysql_core.varchar)("url_hash", { length: 255 }).notNull(),
|
|
66
|
+
/** Serialised request headers (JSON string). */
|
|
67
|
+
requestHeaders: (0, drizzle_orm_mysql_core.longtext)("request_headers"),
|
|
68
|
+
/** Request body (URL-encoded string for POST, null for GET). */
|
|
69
|
+
requestBody: (0, drizzle_orm_mysql_core.longtext)("request_body"),
|
|
70
|
+
/** Response content type ("JSON" or "TEXT"). */
|
|
71
|
+
responseType: (0, drizzle_orm_mysql_core.varchar)("response_type", { length: 10 }).notNull(),
|
|
72
|
+
/** HTTP response status code. */
|
|
73
|
+
statusCode: (0, drizzle_orm_mysql_core.int)("status_code").notNull(),
|
|
74
|
+
/** Serialised response headers (JSON string). */
|
|
75
|
+
responseHeaders: (0, drizzle_orm_mysql_core.longtext)("response_headers"),
|
|
76
|
+
/** Raw response body. */
|
|
77
|
+
responseBody: (0, drizzle_orm_mysql_core.longtext)("response_body").notNull(),
|
|
78
|
+
/** Timestamp when the record was created. */
|
|
79
|
+
createdAt: (0, drizzle_orm_mysql_core.datetime)("created_at", {
|
|
80
|
+
mode: "date",
|
|
81
|
+
fsp: 3
|
|
82
|
+
}).notNull()
|
|
83
|
+
}, (table) => [(0, drizzle_orm_mysql_core.uniqueIndex)("idx_unique").on(table.method, table.endpoint, table.statusCode, table.urlHash)]);
|
|
84
|
+
//#endregion
|
|
85
|
+
//#region src/connection.ts
|
|
86
|
+
/**
|
|
87
|
+
* MySQL connection factory for @book000/pixivts-db-mysql.
|
|
88
|
+
*
|
|
89
|
+
* Creates a mysql2 connection pool and wraps it in a Drizzle ORM instance.
|
|
90
|
+
*/
|
|
64
91
|
function parsePort(value) {
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
92
|
+
if (!value) return 3306;
|
|
93
|
+
const parsed = Number.parseInt(value, 10);
|
|
94
|
+
return Number.isNaN(parsed) ? 3306 : parsed;
|
|
68
95
|
}
|
|
96
|
+
/**
|
|
97
|
+
* Creates a mysql2 connection pool and returns both the raw pool and the
|
|
98
|
+
* Drizzle ORM wrapper.
|
|
99
|
+
*
|
|
100
|
+
* @param opts - Connection options (fall back to environment variables)
|
|
101
|
+
* @returns `{ pool, db }` — raw pool for `close()`, db for queries
|
|
102
|
+
*/
|
|
69
103
|
function createDbConnection(opts) {
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
104
|
+
const pool = mysql2_promise.default.createPool({
|
|
105
|
+
host: opts.host ?? process.env.RESPONSE_DB_HOSTNAME ?? "localhost",
|
|
106
|
+
port: opts.port ?? parsePort(process.env.RESPONSE_DB_PORT),
|
|
107
|
+
user: opts.user ?? process.env.RESPONSE_DB_USERNAME,
|
|
108
|
+
password: opts.password ?? process.env.RESPONSE_DB_PASSWORD,
|
|
109
|
+
database: opts.database ?? process.env.RESPONSE_DB_DATABASE,
|
|
110
|
+
timezone: "+09:00",
|
|
111
|
+
supportBigNumbers: true,
|
|
112
|
+
bigNumberStrings: true
|
|
113
|
+
});
|
|
114
|
+
return {
|
|
115
|
+
pool,
|
|
116
|
+
db: (0, drizzle_orm_mysql2.drizzle)(pool, {
|
|
117
|
+
schema: schema_exports,
|
|
118
|
+
mode: "default"
|
|
119
|
+
})
|
|
120
|
+
};
|
|
82
121
|
}
|
|
122
|
+
//#endregion
|
|
123
|
+
//#region src/migrations.ts
|
|
124
|
+
/**
|
|
125
|
+
* Schema bootstrapping for @book000/pixivts-db-mysql.
|
|
126
|
+
*
|
|
127
|
+
* Provides a `CREATE TABLE IF NOT EXISTS` helper that can be used at startup
|
|
128
|
+
* without requiring drizzle-kit to be installed in production.
|
|
129
|
+
*
|
|
130
|
+
* For full migrations, use:
|
|
131
|
+
* pnpm drizzle-kit generate
|
|
132
|
+
* pnpm drizzle-kit migrate
|
|
133
|
+
*/
|
|
134
|
+
/**
|
|
135
|
+
* Creates the `responses` table if it does not already exist.
|
|
136
|
+
*
|
|
137
|
+
* This is a lightweight alternative to running drizzle-kit migrations in
|
|
138
|
+
* environments where the table has not been set up yet.
|
|
139
|
+
*
|
|
140
|
+
* @param db - Drizzle ORM database instance
|
|
141
|
+
*/
|
|
83
142
|
async function bootstrapSchema(db) {
|
|
84
|
-
|
|
143
|
+
await db.execute(drizzle_orm.sql`
|
|
85
144
|
CREATE TABLE IF NOT EXISTS responses (
|
|
86
145
|
id INT AUTO_INCREMENT PRIMARY KEY COMMENT 'Response ID',
|
|
87
146
|
method VARCHAR(10) NOT NULL COMMENT 'HTTP method',
|
|
@@ -99,79 +158,150 @@ async function bootstrapSchema(db) {
|
|
|
99
158
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
|
|
100
159
|
`);
|
|
101
160
|
}
|
|
102
|
-
|
|
103
|
-
|
|
161
|
+
//#endregion
|
|
162
|
+
//#region src/recorder.ts
|
|
163
|
+
/**
|
|
164
|
+
* Response recorder for @book000/pixivts-db-mysql.
|
|
165
|
+
*
|
|
166
|
+
* `createResponseRecorder()` returns a `{ interceptor, db, close }` bundle:
|
|
167
|
+
* - `interceptor` — pass to `PixivClient.of(token, { onResponse: interceptor })`
|
|
168
|
+
* - `db` — the raw Drizzle instance for custom queries
|
|
169
|
+
* - `close()` — shuts down the connection pool
|
|
170
|
+
*
|
|
171
|
+
* The recorder uses Drizzle ORM's `onDuplicateKeyUpdate` to silently ignore
|
|
172
|
+
* duplicate entries (same method + endpoint + statusCode + urlHash).
|
|
173
|
+
*/
|
|
174
|
+
/**
|
|
175
|
+
* Creates a response recorder that persists every pixiv API response to MySQL.
|
|
176
|
+
*
|
|
177
|
+
* @param opts - Connection and bootstrapping options
|
|
178
|
+
* @returns `{ interceptor, db, close }`
|
|
179
|
+
*
|
|
180
|
+
* @example
|
|
181
|
+
* ```ts
|
|
182
|
+
* const { interceptor, close } = await createResponseRecorder({
|
|
183
|
+
* host: 'localhost',
|
|
184
|
+
* database: 'pixivts',
|
|
185
|
+
* bootstrap: true,
|
|
186
|
+
* })
|
|
187
|
+
* const client = await PixivClient.of(token, { onResponse: interceptor })
|
|
188
|
+
* // ...
|
|
189
|
+
* await close()
|
|
190
|
+
* ```
|
|
191
|
+
*/
|
|
104
192
|
function ninetyDaysAgo() {
|
|
105
|
-
|
|
193
|
+
return /* @__PURE__ */ new Date(Date.now() - 2160 * 60 * 60 * 1e3);
|
|
106
194
|
}
|
|
195
|
+
/**
|
|
196
|
+
* Inserts a response record into the database.
|
|
197
|
+
*
|
|
198
|
+
* If the unique composite index fires (duplicate method + endpoint + statusCode
|
|
199
|
+
* + urlHash), the insert is silently ignored via `ON DUPLICATE KEY UPDATE id = id`.
|
|
200
|
+
*
|
|
201
|
+
* @param db - Drizzle ORM database instance
|
|
202
|
+
* @param record - Response record from the HTTP client interceptor
|
|
203
|
+
*/
|
|
107
204
|
async function addResponse(db, record) {
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
205
|
+
const urlToHash = record.url ?? `${record.method}:${record.endpoint}`;
|
|
206
|
+
const urlHash = node_crypto.default.createHash("sha256").update(urlToHash).digest("hex");
|
|
207
|
+
await db.insert(responsesTable).values({
|
|
208
|
+
method: record.method,
|
|
209
|
+
endpoint: record.endpoint,
|
|
210
|
+
url: record.url,
|
|
211
|
+
urlHash,
|
|
212
|
+
requestHeaders: record.requestHeaders,
|
|
213
|
+
requestBody: record.requestBody,
|
|
214
|
+
responseType: record.responseType,
|
|
215
|
+
statusCode: record.statusCode,
|
|
216
|
+
responseHeaders: record.responseHeaders,
|
|
217
|
+
responseBody: record.responseBody,
|
|
218
|
+
createdAt: /* @__PURE__ */ new Date()
|
|
219
|
+
}).onDuplicateKeyUpdate({ set: { id: drizzle_orm.sql`id` } });
|
|
123
220
|
}
|
|
221
|
+
/**
|
|
222
|
+
* Creates a `RecorderBundle` from an existing Drizzle instance.
|
|
223
|
+
*
|
|
224
|
+
* Useful for testing — pass a mock `db` and a no-op `close`.
|
|
225
|
+
*
|
|
226
|
+
* @param db - Drizzle ORM database instance
|
|
227
|
+
* @param close - Function that closes the underlying connection
|
|
228
|
+
*/
|
|
124
229
|
function createRecorderBundle(db, close) {
|
|
125
|
-
|
|
126
|
-
|
|
230
|
+
const interceptor = (record) => addResponse(db, record);
|
|
231
|
+
return {
|
|
232
|
+
interceptor,
|
|
233
|
+
db,
|
|
234
|
+
close
|
|
235
|
+
};
|
|
127
236
|
}
|
|
237
|
+
/**
|
|
238
|
+
* Creates a response recorder that persists every pixiv API response to MySQL.
|
|
239
|
+
*
|
|
240
|
+
* @param opts - Connection and bootstrapping options
|
|
241
|
+
* @returns `{ interceptor, db, close }`
|
|
242
|
+
*
|
|
243
|
+
* @example
|
|
244
|
+
* ```ts
|
|
245
|
+
* const { interceptor, close } = await createResponseRecorder({
|
|
246
|
+
* host: 'localhost',
|
|
247
|
+
* database: 'pixivts',
|
|
248
|
+
* bootstrap: true,
|
|
249
|
+
* })
|
|
250
|
+
* const client = await PixivClient.of(token, { onResponse: interceptor })
|
|
251
|
+
* // ...
|
|
252
|
+
* await close()
|
|
253
|
+
* ```
|
|
254
|
+
*/
|
|
128
255
|
async function createResponseRecorder(opts) {
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
}
|
|
133
|
-
return createRecorderBundle(db, () => pool.end());
|
|
256
|
+
const { pool, db } = createDbConnection(opts);
|
|
257
|
+
if (opts.bootstrap) await bootstrapSchema(db);
|
|
258
|
+
return createRecorderBundle(db, () => pool.end());
|
|
134
259
|
}
|
|
260
|
+
/**
|
|
261
|
+
* Retrieves response records from the last 90 days.
|
|
262
|
+
*
|
|
263
|
+
* @param db - Drizzle ORM database instance
|
|
264
|
+
* @param filter - Optional filter criteria
|
|
265
|
+
* @param range - Optional pagination options
|
|
266
|
+
* @returns Array of response rows, newest first
|
|
267
|
+
*/
|
|
135
268
|
async function getResponses(db, filter, range) {
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
drizzleOrm.and(
|
|
141
|
-
drizzleOrm.gte(responsesTable.createdAt, since),
|
|
142
|
-
filter?.method ? drizzleOrm.eq(responsesTable.method, filter.method) : void 0,
|
|
143
|
-
filter?.endpoint ? drizzleOrm.eq(responsesTable.endpoint, filter.endpoint) : void 0,
|
|
144
|
-
filter?.statusCode ? drizzleOrm.eq(responsesTable.statusCode, filter.statusCode) : void 0
|
|
145
|
-
)
|
|
146
|
-
).orderBy(drizzleOrm.desc(responsesTable.createdAt)).limit(limit).offset(offset);
|
|
269
|
+
const since = ninetyDaysAgo();
|
|
270
|
+
const limit = range?.limit ?? 100;
|
|
271
|
+
const offset = ((range?.page ?? 1) - 1) * limit;
|
|
272
|
+
return db.select().from(responsesTable).where((0, drizzle_orm.and)((0, drizzle_orm.gte)(responsesTable.createdAt, since), filter?.method ? (0, drizzle_orm.eq)(responsesTable.method, filter.method) : void 0, filter?.endpoint ? (0, drizzle_orm.eq)(responsesTable.endpoint, filter.endpoint) : void 0, filter?.statusCode ? (0, drizzle_orm.eq)(responsesTable.statusCode, filter.statusCode) : void 0)).orderBy((0, drizzle_orm.desc)(responsesTable.createdAt)).limit(limit).offset(offset);
|
|
147
273
|
}
|
|
274
|
+
/**
|
|
275
|
+
* Returns the total count of response records from the last 90 days.
|
|
276
|
+
*
|
|
277
|
+
* @param db - Drizzle ORM database instance
|
|
278
|
+
* @param filter - Optional filter criteria
|
|
279
|
+
* @returns Total row count matching the filter
|
|
280
|
+
*/
|
|
148
281
|
async function getResponseCount(db, filter) {
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
drizzleOrm.and(
|
|
152
|
-
drizzleOrm.gte(responsesTable.createdAt, since),
|
|
153
|
-
filter?.method ? drizzleOrm.eq(responsesTable.method, filter.method) : void 0,
|
|
154
|
-
filter?.endpoint ? drizzleOrm.eq(responsesTable.endpoint, filter.endpoint) : void 0,
|
|
155
|
-
filter?.statusCode ? drizzleOrm.eq(responsesTable.statusCode, filter.statusCode) : void 0
|
|
156
|
-
)
|
|
157
|
-
);
|
|
158
|
-
return rows[0]?.value ?? 0;
|
|
282
|
+
const since = ninetyDaysAgo();
|
|
283
|
+
return (await db.select({ value: (0, drizzle_orm.count)() }).from(responsesTable).where((0, drizzle_orm.and)((0, drizzle_orm.gte)(responsesTable.createdAt, since), filter?.method ? (0, drizzle_orm.eq)(responsesTable.method, filter.method) : void 0, filter?.endpoint ? (0, drizzle_orm.eq)(responsesTable.endpoint, filter.endpoint) : void 0, filter?.statusCode ? (0, drizzle_orm.eq)(responsesTable.statusCode, filter.statusCode) : void 0)))[0]?.value ?? 0;
|
|
159
284
|
}
|
|
285
|
+
/**
|
|
286
|
+
* Returns all unique (method, endpoint, statusCode) combinations seen in the
|
|
287
|
+
* last 90 days, along with the count of matching records.
|
|
288
|
+
*
|
|
289
|
+
* @param db - Drizzle ORM database instance
|
|
290
|
+
* @returns Endpoints sorted by count descending
|
|
291
|
+
*/
|
|
160
292
|
async function getEndpoints(db) {
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
).orderBy(drizzleOrm.desc(drizzleOrm.count()));
|
|
172
|
-
return rows.map((r) => ({ ...r, count: r.count }));
|
|
293
|
+
const since = ninetyDaysAgo();
|
|
294
|
+
return (await db.select({
|
|
295
|
+
method: responsesTable.method,
|
|
296
|
+
endpoint: responsesTable.endpoint,
|
|
297
|
+
statusCode: responsesTable.statusCode,
|
|
298
|
+
count: (0, drizzle_orm.count)()
|
|
299
|
+
}).from(responsesTable).where((0, drizzle_orm.gte)(responsesTable.createdAt, since)).groupBy(responsesTable.method, responsesTable.endpoint, responsesTable.statusCode).orderBy((0, drizzle_orm.desc)((0, drizzle_orm.count)()))).map((r) => ({
|
|
300
|
+
...r,
|
|
301
|
+
count: r.count
|
|
302
|
+
}));
|
|
173
303
|
}
|
|
174
|
-
|
|
304
|
+
//#endregion
|
|
175
305
|
exports.addResponse = addResponse;
|
|
176
306
|
exports.bootstrapSchema = bootstrapSchema;
|
|
177
307
|
exports.createDbConnection = createDbConnection;
|