@heyhru/business-dms-user 0.2.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/README.md +27 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +145 -0
- package/dist/index.mjs +112 -0
- package/dist/users.model.d.ts +15 -0
- package/dist/users.model.d.ts.map +1 -0
- package/dist/users.service.d.ts +11 -0
- package/dist/users.service.d.ts.map +1 -0
- package/dist/users.sql.d.ts +7 -0
- package/dist/users.sql.d.ts.map +1 -0
- package/package.json +39 -0
package/README.md
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# @heyhru/business-dms-user
|
|
2
|
+
|
|
3
|
+
DMS user domain logic: service, model, sql.
|
|
4
|
+
|
|
5
|
+
## API
|
|
6
|
+
|
|
7
|
+
### `getUserByUsername(username: string)`
|
|
8
|
+
|
|
9
|
+
Look up a user by username. Returns the full user row (including `password_hash`) or `undefined`.
|
|
10
|
+
|
|
11
|
+
Used by auth service for login and password change.
|
|
12
|
+
|
|
13
|
+
### `updateUserPassword(id: string, hash: string)`
|
|
14
|
+
|
|
15
|
+
Update the `password_hash` for a user by ID.
|
|
16
|
+
|
|
17
|
+
### Route handlers (Fastify)
|
|
18
|
+
|
|
19
|
+
The following functions are route-facing handlers with signature `(req: FastifyRequest, reply: FastifyReply)`. Register them directly on a Fastify instance.
|
|
20
|
+
|
|
21
|
+
| Function | Route action | Description |
|
|
22
|
+
| ------------ | -------------------- | -------------------------------- |
|
|
23
|
+
| `userList` | `POST /users/list` | List all users |
|
|
24
|
+
| `userGet` | `POST /users/get` | Get a user by `id` in body |
|
|
25
|
+
| `userCreate` | `POST /users/create` | Create a user, hashes password |
|
|
26
|
+
| `userUpdate` | `POST /users/update` | Update `email` or `role` by `id` |
|
|
27
|
+
| `userDelete` | `POST /users/delete` | Delete a user by `id` |
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,QAAQ,EACR,OAAO,EACP,UAAU,EACV,UAAU,EACV,UAAU,GACX,MAAM,oBAAoB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/index.ts
|
|
21
|
+
var index_exports = {};
|
|
22
|
+
__export(index_exports, {
|
|
23
|
+
getUserByUsername: () => getUserByUsername2,
|
|
24
|
+
updateUserPassword: () => updateUserPassword,
|
|
25
|
+
userCreate: () => userCreate,
|
|
26
|
+
userDelete: () => userDelete,
|
|
27
|
+
userGet: () => userGet,
|
|
28
|
+
userList: () => userList,
|
|
29
|
+
userUpdate: () => userUpdate
|
|
30
|
+
});
|
|
31
|
+
module.exports = __toCommonJS(index_exports);
|
|
32
|
+
|
|
33
|
+
// src/users.service.ts
|
|
34
|
+
var import_server_util_crypto = require("@heyhru/server-util-crypto");
|
|
35
|
+
|
|
36
|
+
// src/users.model.ts
|
|
37
|
+
var import_server_plugin_pg = require("@heyhru/server-plugin-pg");
|
|
38
|
+
|
|
39
|
+
// src/users.sql.ts
|
|
40
|
+
var LIST = `
|
|
41
|
+
SELECT id, username, email, role, created_at
|
|
42
|
+
FROM users
|
|
43
|
+
ORDER BY created_at DESC`;
|
|
44
|
+
var FIND_BY_ID = `
|
|
45
|
+
SELECT id, username, email, role, created_at
|
|
46
|
+
FROM users
|
|
47
|
+
WHERE id = ?`;
|
|
48
|
+
var FIND_BY_USERNAME = `
|
|
49
|
+
SELECT *
|
|
50
|
+
FROM users
|
|
51
|
+
WHERE username = ?`;
|
|
52
|
+
var CREATE = `
|
|
53
|
+
INSERT INTO users (username, email, password_hash, role)
|
|
54
|
+
VALUES (?, ?, ?, ?)
|
|
55
|
+
RETURNING id, username, email, role, created_at`;
|
|
56
|
+
var UPDATE_PASSWORD = () => `
|
|
57
|
+
UPDATE users
|
|
58
|
+
SET password_hash = ?, updated_at = NOW()
|
|
59
|
+
WHERE id = ?`;
|
|
60
|
+
var DELETE = `
|
|
61
|
+
DELETE FROM users
|
|
62
|
+
WHERE id = ?`;
|
|
63
|
+
|
|
64
|
+
// src/users.model.ts
|
|
65
|
+
function listUsers() {
|
|
66
|
+
return (0, import_server_plugin_pg.getPgDb)().query(LIST);
|
|
67
|
+
}
|
|
68
|
+
function getUserById(id) {
|
|
69
|
+
return (0, import_server_plugin_pg.getPgDb)().queryOne(FIND_BY_ID, [id]);
|
|
70
|
+
}
|
|
71
|
+
function getUserByUsername(username) {
|
|
72
|
+
return (0, import_server_plugin_pg.getPgDb)().queryOne(FIND_BY_USERNAME, [username]);
|
|
73
|
+
}
|
|
74
|
+
function createUserRow(username, email, hash, role) {
|
|
75
|
+
return (0, import_server_plugin_pg.getPgDb)().queryOne(CREATE, [username, email, hash, role]);
|
|
76
|
+
}
|
|
77
|
+
async function updateUserRow(id, data) {
|
|
78
|
+
const fields = [];
|
|
79
|
+
const values = [];
|
|
80
|
+
if (data.email) {
|
|
81
|
+
fields.push("email = ?");
|
|
82
|
+
values.push(data.email);
|
|
83
|
+
}
|
|
84
|
+
if (data.role) {
|
|
85
|
+
fields.push("role = ?");
|
|
86
|
+
values.push(data.role);
|
|
87
|
+
}
|
|
88
|
+
if (!fields.length) return getUserById(id);
|
|
89
|
+
fields.push("updated_at = NOW()");
|
|
90
|
+
values.push(id);
|
|
91
|
+
return (0, import_server_plugin_pg.getPgDb)().queryOne(
|
|
92
|
+
`UPDATE users SET ${fields.join(", ")} WHERE id = ? RETURNING id, username, email, role, created_at`,
|
|
93
|
+
values
|
|
94
|
+
);
|
|
95
|
+
}
|
|
96
|
+
function deleteUser(id) {
|
|
97
|
+
return (0, import_server_plugin_pg.getPgDb)().run(DELETE, [id]);
|
|
98
|
+
}
|
|
99
|
+
function updatePasswordHash(id, hash) {
|
|
100
|
+
return (0, import_server_plugin_pg.getPgDb)().run(UPDATE_PASSWORD(), [hash, id]);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// src/users.service.ts
|
|
104
|
+
function getUserByUsername2(username) {
|
|
105
|
+
return getUserByUsername(username);
|
|
106
|
+
}
|
|
107
|
+
function updateUserPassword(id, hash) {
|
|
108
|
+
return updatePasswordHash(id, hash);
|
|
109
|
+
}
|
|
110
|
+
async function userList(_req, reply) {
|
|
111
|
+
return reply.send(await listUsers());
|
|
112
|
+
}
|
|
113
|
+
async function userGet(req, reply) {
|
|
114
|
+
const { id } = req.body ?? {};
|
|
115
|
+
const user = await getUserById(id);
|
|
116
|
+
if (!user) return reply.code(404).send({ error: "\u672A\u627E\u5230" });
|
|
117
|
+
return reply.send(user);
|
|
118
|
+
}
|
|
119
|
+
async function userCreate(req, reply) {
|
|
120
|
+
const body = req.body ?? {};
|
|
121
|
+
const hash = await (0, import_server_util_crypto.hashPassword)(body.password);
|
|
122
|
+
const user = await createUserRow(body.username, body.email, hash, body.role);
|
|
123
|
+
return reply.code(201).send(user);
|
|
124
|
+
}
|
|
125
|
+
async function userUpdate(req, reply) {
|
|
126
|
+
const { id, ...rest } = req.body ?? {};
|
|
127
|
+
const user = await updateUserRow(id, rest);
|
|
128
|
+
if (!user) return reply.code(404).send({ error: "\u672A\u627E\u5230" });
|
|
129
|
+
return reply.send(user);
|
|
130
|
+
}
|
|
131
|
+
async function userDelete(req, reply) {
|
|
132
|
+
const { id } = req.body ?? {};
|
|
133
|
+
await deleteUser(id);
|
|
134
|
+
return reply.code(204).send();
|
|
135
|
+
}
|
|
136
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
137
|
+
0 && (module.exports = {
|
|
138
|
+
getUserByUsername,
|
|
139
|
+
updateUserPassword,
|
|
140
|
+
userCreate,
|
|
141
|
+
userDelete,
|
|
142
|
+
userGet,
|
|
143
|
+
userList,
|
|
144
|
+
userUpdate
|
|
145
|
+
});
|
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
// src/users.service.ts
|
|
2
|
+
import { hashPassword } from "@heyhru/server-util-crypto";
|
|
3
|
+
|
|
4
|
+
// src/users.model.ts
|
|
5
|
+
import { getPgDb } from "@heyhru/server-plugin-pg";
|
|
6
|
+
|
|
7
|
+
// src/users.sql.ts
|
|
8
|
+
var LIST = `
|
|
9
|
+
SELECT id, username, email, role, created_at
|
|
10
|
+
FROM users
|
|
11
|
+
ORDER BY created_at DESC`;
|
|
12
|
+
var FIND_BY_ID = `
|
|
13
|
+
SELECT id, username, email, role, created_at
|
|
14
|
+
FROM users
|
|
15
|
+
WHERE id = ?`;
|
|
16
|
+
var FIND_BY_USERNAME = `
|
|
17
|
+
SELECT *
|
|
18
|
+
FROM users
|
|
19
|
+
WHERE username = ?`;
|
|
20
|
+
var CREATE = `
|
|
21
|
+
INSERT INTO users (username, email, password_hash, role)
|
|
22
|
+
VALUES (?, ?, ?, ?)
|
|
23
|
+
RETURNING id, username, email, role, created_at`;
|
|
24
|
+
var UPDATE_PASSWORD = () => `
|
|
25
|
+
UPDATE users
|
|
26
|
+
SET password_hash = ?, updated_at = NOW()
|
|
27
|
+
WHERE id = ?`;
|
|
28
|
+
var DELETE = `
|
|
29
|
+
DELETE FROM users
|
|
30
|
+
WHERE id = ?`;
|
|
31
|
+
|
|
32
|
+
// src/users.model.ts
|
|
33
|
+
function listUsers() {
|
|
34
|
+
return getPgDb().query(LIST);
|
|
35
|
+
}
|
|
36
|
+
function getUserById(id) {
|
|
37
|
+
return getPgDb().queryOne(FIND_BY_ID, [id]);
|
|
38
|
+
}
|
|
39
|
+
function getUserByUsername(username) {
|
|
40
|
+
return getPgDb().queryOne(FIND_BY_USERNAME, [username]);
|
|
41
|
+
}
|
|
42
|
+
function createUserRow(username, email, hash, role) {
|
|
43
|
+
return getPgDb().queryOne(CREATE, [username, email, hash, role]);
|
|
44
|
+
}
|
|
45
|
+
async function updateUserRow(id, data) {
|
|
46
|
+
const fields = [];
|
|
47
|
+
const values = [];
|
|
48
|
+
if (data.email) {
|
|
49
|
+
fields.push("email = ?");
|
|
50
|
+
values.push(data.email);
|
|
51
|
+
}
|
|
52
|
+
if (data.role) {
|
|
53
|
+
fields.push("role = ?");
|
|
54
|
+
values.push(data.role);
|
|
55
|
+
}
|
|
56
|
+
if (!fields.length) return getUserById(id);
|
|
57
|
+
fields.push("updated_at = NOW()");
|
|
58
|
+
values.push(id);
|
|
59
|
+
return getPgDb().queryOne(
|
|
60
|
+
`UPDATE users SET ${fields.join(", ")} WHERE id = ? RETURNING id, username, email, role, created_at`,
|
|
61
|
+
values
|
|
62
|
+
);
|
|
63
|
+
}
|
|
64
|
+
function deleteUser(id) {
|
|
65
|
+
return getPgDb().run(DELETE, [id]);
|
|
66
|
+
}
|
|
67
|
+
function updatePasswordHash(id, hash) {
|
|
68
|
+
return getPgDb().run(UPDATE_PASSWORD(), [hash, id]);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// src/users.service.ts
|
|
72
|
+
function getUserByUsername2(username) {
|
|
73
|
+
return getUserByUsername(username);
|
|
74
|
+
}
|
|
75
|
+
function updateUserPassword(id, hash) {
|
|
76
|
+
return updatePasswordHash(id, hash);
|
|
77
|
+
}
|
|
78
|
+
async function userList(_req, reply) {
|
|
79
|
+
return reply.send(await listUsers());
|
|
80
|
+
}
|
|
81
|
+
async function userGet(req, reply) {
|
|
82
|
+
const { id } = req.body ?? {};
|
|
83
|
+
const user = await getUserById(id);
|
|
84
|
+
if (!user) return reply.code(404).send({ error: "\u672A\u627E\u5230" });
|
|
85
|
+
return reply.send(user);
|
|
86
|
+
}
|
|
87
|
+
async function userCreate(req, reply) {
|
|
88
|
+
const body = req.body ?? {};
|
|
89
|
+
const hash = await hashPassword(body.password);
|
|
90
|
+
const user = await createUserRow(body.username, body.email, hash, body.role);
|
|
91
|
+
return reply.code(201).send(user);
|
|
92
|
+
}
|
|
93
|
+
async function userUpdate(req, reply) {
|
|
94
|
+
const { id, ...rest } = req.body ?? {};
|
|
95
|
+
const user = await updateUserRow(id, rest);
|
|
96
|
+
if (!user) return reply.code(404).send({ error: "\u672A\u627E\u5230" });
|
|
97
|
+
return reply.send(user);
|
|
98
|
+
}
|
|
99
|
+
async function userDelete(req, reply) {
|
|
100
|
+
const { id } = req.body ?? {};
|
|
101
|
+
await deleteUser(id);
|
|
102
|
+
return reply.code(204).send();
|
|
103
|
+
}
|
|
104
|
+
export {
|
|
105
|
+
getUserByUsername2 as getUserByUsername,
|
|
106
|
+
updateUserPassword,
|
|
107
|
+
userCreate,
|
|
108
|
+
userDelete,
|
|
109
|
+
userGet,
|
|
110
|
+
userList,
|
|
111
|
+
userUpdate
|
|
112
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export declare function listUsers(): Promise<Record<string, unknown>[]>;
|
|
2
|
+
export declare function getUserById(id: string): Promise<Record<string, unknown> | undefined>;
|
|
3
|
+
export declare function getUserByUsername(username: string): Promise<Record<string, unknown> | undefined>;
|
|
4
|
+
export declare function createUserRow(username: string, email: string, hash: string, role: string): Promise<Record<string, unknown> | undefined>;
|
|
5
|
+
export declare function updateUserRow(id: string, data: {
|
|
6
|
+
email?: string;
|
|
7
|
+
role?: string;
|
|
8
|
+
}): Promise<Record<string, unknown> | undefined>;
|
|
9
|
+
export declare function deleteUser(id: string): Promise<{
|
|
10
|
+
changes: number;
|
|
11
|
+
}>;
|
|
12
|
+
export declare function updatePasswordHash(id: string, hash: string): Promise<{
|
|
13
|
+
changes: number;
|
|
14
|
+
}>;
|
|
15
|
+
//# sourceMappingURL=users.model.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"users.model.d.ts","sourceRoot":"","sources":["../src/users.model.ts"],"names":[],"mappings":"AAGA,wBAAgB,SAAS,uCAExB;AAED,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,gDAErC;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,gDAEjD;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,gDAExF;AAED,wBAAsB,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,gDAkBtF;AAED,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM;;GAEpC;AAED,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;;GAE1D"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type FastifyRequest, type FastifyReply } from "fastify";
|
|
2
|
+
export declare function getUserByUsername(username: string): Promise<Record<string, unknown> | undefined>;
|
|
3
|
+
export declare function updateUserPassword(id: string, hash: string): Promise<{
|
|
4
|
+
changes: number;
|
|
5
|
+
}>;
|
|
6
|
+
export declare function userList(_req: FastifyRequest, reply: FastifyReply): Promise<never>;
|
|
7
|
+
export declare function userGet(req: FastifyRequest, reply: FastifyReply): Promise<never>;
|
|
8
|
+
export declare function userCreate(req: FastifyRequest, reply: FastifyReply): Promise<never>;
|
|
9
|
+
export declare function userUpdate(req: FastifyRequest, reply: FastifyReply): Promise<never>;
|
|
10
|
+
export declare function userDelete(req: FastifyRequest, reply: FastifyReply): Promise<never>;
|
|
11
|
+
//# sourceMappingURL=users.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"users.service.d.ts","sourceRoot":"","sources":["../src/users.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,YAAY,EAAE,MAAM,SAAS,CAAC;AAYjE,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,gDAEjD;AAED,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;;GAE1D;AAED,wBAAsB,QAAQ,CAAC,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,YAAY,kBAEvE;AAED,wBAAsB,OAAO,CAAC,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,YAAY,kBAKrE;AAED,wBAAsB,UAAU,CAAC,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,YAAY,kBAUxE;AAED,wBAAsB,UAAU,CAAC,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,YAAY,kBAKxE;AAED,wBAAsB,UAAU,CAAC,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,YAAY,kBAIxE"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare const LIST = "\nSELECT id, username, email, role, created_at\nFROM users\nORDER BY created_at DESC";
|
|
2
|
+
export declare const FIND_BY_ID = "\nSELECT id, username, email, role, created_at\nFROM users\nWHERE id = ?";
|
|
3
|
+
export declare const FIND_BY_USERNAME = "\nSELECT *\nFROM users\nWHERE username = ?";
|
|
4
|
+
export declare const CREATE = "\nINSERT INTO users (username, email, password_hash, role)\nVALUES (?, ?, ?, ?)\nRETURNING id, username, email, role, created_at";
|
|
5
|
+
export declare const UPDATE_PASSWORD: () => string;
|
|
6
|
+
export declare const DELETE = "\nDELETE FROM users\nWHERE id = ?";
|
|
7
|
+
//# sourceMappingURL=users.sql.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"users.sql.d.ts","sourceRoot":"","sources":["../src/users.sql.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,IAAI,yFAGQ,CAAC;AAE1B,eAAO,MAAM,UAAU,6EAGV,CAAC;AAEd,eAAO,MAAM,gBAAgB,+CAGV,CAAC;AAEpB,eAAO,MAAM,MAAM,qIAG6B,CAAC;AAEjD,eAAO,MAAM,eAAe,cAGf,CAAC;AAEd,eAAO,MAAM,MAAM,sCAEN,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@heyhru/business-dms-user",
|
|
3
|
+
"publishConfig": {
|
|
4
|
+
"access": "public"
|
|
5
|
+
},
|
|
6
|
+
"version": "0.2.0",
|
|
7
|
+
"description": "DMS user domain logic: service, model, sql",
|
|
8
|
+
"main": "./dist/index.js",
|
|
9
|
+
"module": "./dist/index.mjs",
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"exports": {
|
|
12
|
+
".": {
|
|
13
|
+
"types": "./dist/index.d.ts",
|
|
14
|
+
"import": "./dist/index.mjs",
|
|
15
|
+
"require": "./dist/index.js"
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
"files": [
|
|
19
|
+
"dist"
|
|
20
|
+
],
|
|
21
|
+
"scripts": {
|
|
22
|
+
"build": "tsup && tsc --emitDeclarationOnly",
|
|
23
|
+
"dev": "tsup --watch",
|
|
24
|
+
"lint": "eslint src",
|
|
25
|
+
"test": "vitest run",
|
|
26
|
+
"clean": "rm -rf dist"
|
|
27
|
+
},
|
|
28
|
+
"dependencies": {
|
|
29
|
+
"@heyhru/server-plugin-pg": "0.2.0",
|
|
30
|
+
"@heyhru/server-util-crypto": "0.2.0",
|
|
31
|
+
"fastify": "^5.8.4"
|
|
32
|
+
},
|
|
33
|
+
"devDependencies": {
|
|
34
|
+
"tsup": "^8.5.1",
|
|
35
|
+
"typescript": "^6.0.2",
|
|
36
|
+
"vitest": "^4.1.2"
|
|
37
|
+
},
|
|
38
|
+
"gitHead": "52867b97f908359000f3b690daf2229921dcfd9a"
|
|
39
|
+
}
|