@technomoron/api-server-base 2.0.0-beta.21 → 2.0.0-beta.23
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/cjs/common/types.cjs +10 -0
- package/dist/cjs/common/types.d.ts +137 -0
- package/dist/cjs/{api-module.cjs → server/src/api-module.cjs} +8 -0
- package/dist/{esm → cjs/server/src}/api-module.d.ts +15 -0
- package/dist/cjs/{api-server-base.cjs → server/src/api-server-base.cjs} +669 -627
- package/dist/{esm → cjs/server/src}/api-server-base.d.ts +105 -78
- package/dist/cjs/{auth-api/auth-module.js → server/src/auth-api/auth-module.cjs} +96 -76
- package/dist/cjs/{auth-api → server/src/auth-api}/auth-module.d.ts +1 -1
- package/dist/cjs/{auth-api/compat-auth-storage.js → server/src/auth-api/compat-auth-storage.cjs} +4 -4
- package/dist/cjs/{auth-api/mem-auth-store.js → server/src/auth-api/mem-auth-store.cjs} +7 -7
- package/dist/cjs/{auth-api/module.js → server/src/auth-api/module.cjs} +1 -1
- package/dist/cjs/server/src/auth-api/schemas.cjs +171 -0
- package/dist/cjs/server/src/auth-api/schemas.d.ts +21 -0
- package/dist/cjs/{auth-api/sql-auth-store.js → server/src/auth-api/sql-auth-store.cjs} +8 -8
- package/dist/cjs/{auth-api/user-id.js → server/src/auth-api/user-id.cjs} +12 -3
- package/dist/{esm → cjs/server/src}/auth-cookie-options.d.ts +5 -3
- package/dist/cjs/server/src/base/client-info.cjs +285 -0
- package/dist/cjs/server/src/base/client-info.d.ts +27 -0
- package/dist/cjs/server/src/base/error-utils.cjs +50 -0
- package/dist/cjs/server/src/base/error-utils.d.ts +16 -0
- package/dist/cjs/server/src/base/request-utils.cjs +27 -0
- package/dist/cjs/server/src/base/request-utils.d.ts +8 -0
- package/dist/cjs/{index.cjs → server/src/index.cjs} +24 -15
- package/dist/{esm → cjs/server/src}/index.d.ts +7 -0
- package/dist/cjs/server/src/limiter/auth-rate-limiter.cjs +35 -0
- package/dist/cjs/server/src/limiter/auth-rate-limiter.d.ts +12 -0
- package/dist/cjs/server/src/limiter/fixed-window.cjs +41 -0
- package/dist/cjs/server/src/limiter/fixed-window.d.ts +11 -0
- package/dist/cjs/{oauth/base.js → server/src/oauth/base.cjs} +1 -0
- package/dist/cjs/{oauth → server/src/oauth}/base.d.ts +8 -1
- package/dist/cjs/{oauth/memory.js → server/src/oauth/memory.cjs} +7 -4
- package/dist/{esm → cjs/server/src}/oauth/memory.d.ts +1 -1
- package/dist/cjs/{oauth/models.js → server/src/oauth/models.cjs} +2 -2
- package/dist/cjs/{oauth/sequelize.js → server/src/oauth/sequelize.cjs} +11 -7
- package/dist/{esm → cjs/server/src}/oauth/sequelize.d.ts +1 -1
- package/dist/cjs/{passkey/base.js → server/src/passkey/base.cjs} +1 -0
- package/dist/{esm → cjs/server/src}/passkey/base.d.ts +11 -0
- package/dist/cjs/{passkey/memory.js → server/src/passkey/memory.cjs} +2 -2
- package/dist/cjs/{passkey/models.js → server/src/passkey/models.cjs} +1 -1
- package/dist/cjs/{passkey/sequelize.js → server/src/passkey/sequelize.cjs} +3 -3
- package/dist/cjs/{passkey/service.js → server/src/passkey/service.cjs} +17 -3
- package/dist/{esm → cjs/server/src}/passkey/service.d.ts +1 -1
- package/dist/cjs/{sequelize-utils.js → server/src/sequelize-utils.cjs} +4 -5
- package/dist/cjs/{token/base.js → server/src/token/base.cjs} +4 -0
- package/dist/{esm → cjs/server/src}/token/base.d.ts +7 -0
- package/dist/cjs/{token/memory.js → server/src/token/memory.cjs} +15 -20
- package/dist/cjs/{token/sequelize.js → server/src/token/sequelize.cjs} +25 -11
- package/dist/cjs/server/src/upload/memory.cjs +92 -0
- package/dist/cjs/server/src/upload/memory.d.ts +17 -0
- package/dist/cjs/server/src/upload/tus-module.cjs +270 -0
- package/dist/cjs/server/src/upload/tus-module.d.ts +38 -0
- package/dist/cjs/server/src/upload/types.d.ts +8 -0
- package/dist/cjs/{user/base.js → server/src/user/base.cjs} +1 -0
- package/dist/cjs/{user → server/src/user}/base.d.ts +9 -0
- package/dist/cjs/{user/memory.js → server/src/user/memory.cjs} +29 -7
- package/dist/cjs/{user/sequelize.js → server/src/user/sequelize.cjs} +33 -8
- package/dist/cjs/server/src/user/types.cjs +2 -0
- package/dist/esm/common/types.d.ts +137 -0
- package/dist/esm/common/types.js +9 -0
- package/dist/{cjs → esm/server/src}/api-module.d.ts +15 -0
- package/dist/esm/{api-module.js → server/src/api-module.js} +8 -0
- package/dist/{cjs → esm/server/src}/api-server-base.d.ts +105 -78
- package/dist/esm/{api-server-base.js → server/src/api-server-base.js} +658 -616
- package/dist/esm/{auth-api → server/src/auth-api}/auth-module.d.ts +1 -1
- package/dist/esm/{auth-api → server/src/auth-api}/auth-module.js +92 -72
- package/dist/esm/{auth-api → server/src/auth-api}/compat-auth-storage.js +3 -3
- package/dist/esm/server/src/auth-api/schemas.d.ts +21 -0
- package/dist/esm/server/src/auth-api/schemas.js +168 -0
- package/dist/esm/{auth-api → server/src/auth-api}/user-id.js +12 -3
- package/dist/{cjs → esm/server/src}/auth-cookie-options.d.ts +5 -3
- package/dist/esm/server/src/base/client-info.d.ts +27 -0
- package/dist/esm/server/src/base/client-info.js +282 -0
- package/dist/esm/server/src/base/error-utils.d.ts +16 -0
- package/dist/esm/server/src/base/error-utils.js +44 -0
- package/dist/esm/server/src/base/request-utils.d.ts +8 -0
- package/dist/esm/server/src/base/request-utils.js +23 -0
- package/dist/{cjs → esm/server/src}/index.d.ts +7 -0
- package/dist/esm/{index.js → server/src/index.js} +4 -0
- package/dist/esm/server/src/limiter/auth-rate-limiter.d.ts +12 -0
- package/dist/esm/server/src/limiter/auth-rate-limiter.js +32 -0
- package/dist/esm/server/src/limiter/fixed-window.d.ts +11 -0
- package/dist/esm/server/src/limiter/fixed-window.js +37 -0
- package/dist/esm/{oauth → server/src/oauth}/base.d.ts +8 -1
- package/dist/esm/server/src/oauth/base.js +3 -0
- package/dist/{cjs → esm/server/src}/oauth/memory.d.ts +1 -1
- package/dist/esm/{oauth → server/src/oauth}/memory.js +5 -2
- package/dist/{cjs → esm/server/src}/oauth/sequelize.d.ts +1 -1
- package/dist/esm/{oauth → server/src/oauth}/sequelize.js +6 -2
- package/dist/{cjs → esm/server/src}/passkey/base.d.ts +11 -0
- package/dist/esm/server/src/passkey/base.js +3 -0
- package/dist/{cjs → esm/server/src}/passkey/service.d.ts +1 -1
- package/dist/esm/{passkey → server/src/passkey}/service.js +17 -3
- package/dist/esm/{sequelize-utils.js → server/src/sequelize-utils.js} +4 -5
- package/dist/{cjs → esm/server/src}/token/base.d.ts +7 -0
- package/dist/esm/{token → server/src/token}/base.js +4 -0
- package/dist/esm/{token → server/src/token}/memory.js +14 -19
- package/dist/esm/{token → server/src/token}/sequelize.js +22 -8
- package/dist/esm/server/src/upload/memory.d.ts +17 -0
- package/dist/esm/server/src/upload/memory.js +86 -0
- package/dist/esm/server/src/upload/tus-module.d.ts +38 -0
- package/dist/esm/server/src/upload/tus-module.js +266 -0
- package/dist/esm/server/src/upload/types.d.ts +8 -0
- package/dist/esm/{user → server/src/user}/base.d.ts +9 -0
- package/dist/esm/{user → server/src/user}/base.js +1 -0
- package/dist/esm/{user → server/src/user}/memory.js +27 -5
- package/dist/esm/{user → server/src/user}/sequelize.js +30 -5
- package/dist/esm/server/src/user/types.js +1 -0
- package/docs/swagger/openapi.json +411 -125
- package/package.json +129 -134
- package/README.txt +0 -213
- package/dist/esm/oauth/base.js +0 -2
- package/dist/esm/passkey/base.js +0 -2
- /package/dist/cjs/{auth-api → server/src/auth-api}/compat-auth-storage.d.ts +0 -0
- /package/dist/cjs/{auth-api → server/src/auth-api}/mem-auth-store.d.ts +0 -0
- /package/dist/cjs/{auth-api → server/src/auth-api}/module.d.ts +0 -0
- /package/dist/cjs/{auth-api → server/src/auth-api}/sql-auth-store.d.ts +0 -0
- /package/dist/cjs/{auth-api/storage.js → server/src/auth-api/storage.cjs} +0 -0
- /package/dist/cjs/{auth-api → server/src/auth-api}/storage.d.ts +0 -0
- /package/dist/cjs/{auth-api/types.js → server/src/auth-api/types.cjs} +0 -0
- /package/dist/cjs/{auth-api → server/src/auth-api}/types.d.ts +0 -0
- /package/dist/cjs/{auth-api → server/src/auth-api}/user-id.d.ts +0 -0
- /package/dist/cjs/{auth-cookie-options.js → server/src/auth-cookie-options.cjs} +0 -0
- /package/dist/cjs/{oauth → server/src/oauth}/models.d.ts +0 -0
- /package/dist/cjs/{oauth/types.js → server/src/oauth/types.cjs} +0 -0
- /package/dist/cjs/{oauth → server/src/oauth}/types.d.ts +0 -0
- /package/dist/cjs/{passkey/config.js → server/src/passkey/config.cjs} +0 -0
- /package/dist/cjs/{passkey → server/src/passkey}/config.d.ts +0 -0
- /package/dist/cjs/{passkey → server/src/passkey}/memory.d.ts +0 -0
- /package/dist/cjs/{passkey → server/src/passkey}/models.d.ts +0 -0
- /package/dist/cjs/{passkey → server/src/passkey}/sequelize.d.ts +0 -0
- /package/dist/cjs/{passkey/types.js → server/src/passkey/types.cjs} +0 -0
- /package/dist/cjs/{passkey → server/src/passkey}/types.d.ts +0 -0
- /package/dist/cjs/{sequelize-utils.d.ts → server/src/sequelize-utils.d.ts} +0 -0
- /package/dist/cjs/{token → server/src/token}/memory.d.ts +0 -0
- /package/dist/cjs/{token → server/src/token}/sequelize.d.ts +0 -0
- /package/dist/cjs/{token/types.js → server/src/token/types.cjs} +0 -0
- /package/dist/cjs/{token → server/src/token}/types.d.ts +0 -0
- /package/dist/cjs/{user/types.js → server/src/upload/types.cjs} +0 -0
- /package/dist/cjs/{user → server/src/user}/memory.d.ts +0 -0
- /package/dist/cjs/{user → server/src/user}/sequelize.d.ts +0 -0
- /package/dist/cjs/{user → server/src/user}/types.d.ts +0 -0
- /package/dist/esm/{auth-api → server/src/auth-api}/compat-auth-storage.d.ts +0 -0
- /package/dist/esm/{auth-api → server/src/auth-api}/mem-auth-store.d.ts +0 -0
- /package/dist/esm/{auth-api → server/src/auth-api}/mem-auth-store.js +0 -0
- /package/dist/esm/{auth-api → server/src/auth-api}/module.d.ts +0 -0
- /package/dist/esm/{auth-api → server/src/auth-api}/module.js +0 -0
- /package/dist/esm/{auth-api → server/src/auth-api}/sql-auth-store.d.ts +0 -0
- /package/dist/esm/{auth-api → server/src/auth-api}/sql-auth-store.js +0 -0
- /package/dist/esm/{auth-api → server/src/auth-api}/storage.d.ts +0 -0
- /package/dist/esm/{auth-api → server/src/auth-api}/storage.js +0 -0
- /package/dist/esm/{auth-api → server/src/auth-api}/types.d.ts +0 -0
- /package/dist/esm/{auth-api → server/src/auth-api}/types.js +0 -0
- /package/dist/esm/{auth-api → server/src/auth-api}/user-id.d.ts +0 -0
- /package/dist/esm/{auth-cookie-options.js → server/src/auth-cookie-options.js} +0 -0
- /package/dist/esm/{oauth → server/src/oauth}/models.d.ts +0 -0
- /package/dist/esm/{oauth → server/src/oauth}/models.js +0 -0
- /package/dist/esm/{oauth → server/src/oauth}/types.d.ts +0 -0
- /package/dist/esm/{oauth → server/src/oauth}/types.js +0 -0
- /package/dist/esm/{passkey → server/src/passkey}/config.d.ts +0 -0
- /package/dist/esm/{passkey → server/src/passkey}/config.js +0 -0
- /package/dist/esm/{passkey → server/src/passkey}/memory.d.ts +0 -0
- /package/dist/esm/{passkey → server/src/passkey}/memory.js +0 -0
- /package/dist/esm/{passkey → server/src/passkey}/models.d.ts +0 -0
- /package/dist/esm/{passkey → server/src/passkey}/models.js +0 -0
- /package/dist/esm/{passkey → server/src/passkey}/sequelize.d.ts +0 -0
- /package/dist/esm/{passkey → server/src/passkey}/sequelize.js +0 -0
- /package/dist/esm/{passkey → server/src/passkey}/types.d.ts +0 -0
- /package/dist/esm/{passkey → server/src/passkey}/types.js +0 -0
- /package/dist/esm/{sequelize-utils.d.ts → server/src/sequelize-utils.d.ts} +0 -0
- /package/dist/esm/{token → server/src/token}/memory.d.ts +0 -0
- /package/dist/esm/{token → server/src/token}/sequelize.d.ts +0 -0
- /package/dist/esm/{token → server/src/token}/types.d.ts +0 -0
- /package/dist/esm/{token → server/src/token}/types.js +0 -0
- /package/dist/esm/{user → server/src/upload}/types.js +0 -0
- /package/dist/esm/{user → server/src/user}/memory.d.ts +0 -0
- /package/dist/esm/{user → server/src/user}/sequelize.d.ts +0 -0
- /package/dist/esm/{user → server/src/user}/types.d.ts +0 -0
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { CreateUserInput, PublicUserMapper, UpdateUserInput } from './types.js';
|
|
2
2
|
import type { AuthIdentifier } from '../auth-api/types.js';
|
|
3
|
+
/** Base contract for user persistence backends. */
|
|
3
4
|
export declare abstract class UserStore<User, PublicUser> {
|
|
4
5
|
protected readonly toPublicUser: PublicUserMapper<User, PublicUser>;
|
|
5
6
|
private readonly bcryptRounds;
|
|
@@ -13,14 +14,22 @@ export declare abstract class UserStore<User, PublicUser> {
|
|
|
13
14
|
protected hashPassword(plain: string): Promise<string>;
|
|
14
15
|
verifyPassword(plain: string, hashed: string): Promise<boolean>;
|
|
15
16
|
protected normalizeUserInput(input: Partial<CreateUserInput>): CreateUserInput;
|
|
17
|
+
/** Find a user by id/login/email identifier. */
|
|
16
18
|
abstract findUser(identifier: AuthIdentifier | string): Promise<User | null>;
|
|
19
|
+
/** Find a user by primary id only. */
|
|
17
20
|
abstract findById(id: AuthIdentifier): Promise<User | null>;
|
|
21
|
+
/** Find a user by login or email value. */
|
|
18
22
|
abstract findByLoginOrEmail(loginOrEmail: string): Promise<User | null>;
|
|
23
|
+
/** Create a new user record. */
|
|
19
24
|
abstract createUser(input: CreateUserInput): Promise<User>;
|
|
20
25
|
abstract upsertUser(input: CreateUserInput): Promise<User>;
|
|
26
|
+
/** Update selected user fields. */
|
|
21
27
|
abstract updateUser(id: AuthIdentifier, patch: UpdateUserInput): Promise<User>;
|
|
28
|
+
/** Persist a password hash for the given user id. */
|
|
22
29
|
abstract setPasswordHash(id: AuthIdentifier, hash: string): Promise<void>;
|
|
30
|
+
/** Extract the password hash from a user record. */
|
|
23
31
|
abstract getPasswordHash(user: User): string | null;
|
|
32
|
+
/** Extract the stable user identifier from a user record. */
|
|
24
33
|
abstract getUserId(user: User): AuthIdentifier;
|
|
25
34
|
toPublic(user: User): PublicUser;
|
|
26
35
|
}
|
|
@@ -41,11 +41,15 @@ export class MemoryUserStore extends UserStore {
|
|
|
41
41
|
}
|
|
42
42
|
const loginId = this.loginToId.get(identifier);
|
|
43
43
|
if (loginId !== undefined) {
|
|
44
|
-
|
|
44
|
+
const loginUser = this.usersById.get(loginId);
|
|
45
|
+
if (loginUser)
|
|
46
|
+
return cloneUser(loginUser);
|
|
45
47
|
}
|
|
46
48
|
const emailId = this.emailToId.get(identifier);
|
|
47
49
|
if (emailId !== undefined) {
|
|
48
|
-
|
|
50
|
+
const emailUser = this.usersById.get(emailId);
|
|
51
|
+
if (emailUser)
|
|
52
|
+
return cloneUser(emailUser);
|
|
49
53
|
}
|
|
50
54
|
}
|
|
51
55
|
return null;
|
|
@@ -61,7 +65,19 @@ export class MemoryUserStore extends UserStore {
|
|
|
61
65
|
}
|
|
62
66
|
}
|
|
63
67
|
async findByLoginOrEmail(loginOrEmail) {
|
|
64
|
-
|
|
68
|
+
const loginId = this.loginToId.get(loginOrEmail);
|
|
69
|
+
if (loginId !== undefined) {
|
|
70
|
+
const loginUser = this.usersById.get(loginId);
|
|
71
|
+
if (loginUser)
|
|
72
|
+
return cloneUser(loginUser);
|
|
73
|
+
}
|
|
74
|
+
const emailId = this.emailToId.get(loginOrEmail);
|
|
75
|
+
if (emailId !== undefined) {
|
|
76
|
+
const emailUser = this.usersById.get(emailId);
|
|
77
|
+
if (emailUser)
|
|
78
|
+
return cloneUser(emailUser);
|
|
79
|
+
}
|
|
80
|
+
return null;
|
|
65
81
|
}
|
|
66
82
|
async createUser(input) {
|
|
67
83
|
const normalizedInput = this.normalizeUserInput(input);
|
|
@@ -115,9 +131,12 @@ export class MemoryUserStore extends UserStore {
|
|
|
115
131
|
throw new Error(`User with email ${updates.email} already exists`);
|
|
116
132
|
}
|
|
117
133
|
}
|
|
118
|
-
if (normalizedInput.password) {
|
|
134
|
+
if (normalizedInput.password && normalizedInput.password.length > 0) {
|
|
119
135
|
updates.password = await this.hashPassword(normalizedInput.password);
|
|
120
136
|
}
|
|
137
|
+
else {
|
|
138
|
+
updates.password = existing.password;
|
|
139
|
+
}
|
|
121
140
|
this.persistUser(updates);
|
|
122
141
|
return cloneUser(updates);
|
|
123
142
|
}
|
|
@@ -129,9 +148,12 @@ export class MemoryUserStore extends UserStore {
|
|
|
129
148
|
throw new Error(`User ${String(id)} not found`);
|
|
130
149
|
}
|
|
131
150
|
const updates = { ...user, ...patch };
|
|
132
|
-
if (patch.password) {
|
|
151
|
+
if (patch.password && patch.password.length > 0) {
|
|
133
152
|
updates.password = await this.hashPassword(patch.password);
|
|
134
153
|
}
|
|
154
|
+
else {
|
|
155
|
+
updates.password = user.password;
|
|
156
|
+
}
|
|
135
157
|
this.persistUser(updates);
|
|
136
158
|
return cloneUser(updates);
|
|
137
159
|
}
|
|
@@ -115,11 +115,22 @@ export class SequelizeUserStore extends UserStore {
|
|
|
115
115
|
throw new Error(`User ${String(providedId)} not found`);
|
|
116
116
|
}
|
|
117
117
|
const next = { ...normalized };
|
|
118
|
-
if (normalized.password) {
|
|
118
|
+
if (normalized.password && normalized.password.length > 0) {
|
|
119
119
|
next.password = await this.hashPassword(normalized.password);
|
|
120
120
|
}
|
|
121
|
+
else {
|
|
122
|
+
delete next.password;
|
|
123
|
+
}
|
|
121
124
|
await model.set(next);
|
|
122
|
-
|
|
125
|
+
try {
|
|
126
|
+
await model.save();
|
|
127
|
+
}
|
|
128
|
+
catch (error) {
|
|
129
|
+
if (error instanceof UniqueConstraintError) {
|
|
130
|
+
throw new Error(`User with login ${normalized.login} or email ${normalized.email} already exists`);
|
|
131
|
+
}
|
|
132
|
+
throw error;
|
|
133
|
+
}
|
|
123
134
|
return this.toUserRecord(model);
|
|
124
135
|
}
|
|
125
136
|
return this.createUser(input);
|
|
@@ -130,15 +141,29 @@ export class SequelizeUserStore extends UserStore {
|
|
|
130
141
|
throw new Error(`User ${String(id)} not found`);
|
|
131
142
|
}
|
|
132
143
|
const updates = { ...patch };
|
|
133
|
-
if (patch.password) {
|
|
144
|
+
if (patch.password && patch.password.length > 0) {
|
|
134
145
|
updates.password = await this.hashPassword(patch.password);
|
|
135
146
|
}
|
|
147
|
+
else {
|
|
148
|
+
delete updates.password;
|
|
149
|
+
}
|
|
136
150
|
await model.set(updates);
|
|
137
|
-
|
|
151
|
+
try {
|
|
152
|
+
await model.save();
|
|
153
|
+
}
|
|
154
|
+
catch (error) {
|
|
155
|
+
if (error instanceof UniqueConstraintError) {
|
|
156
|
+
throw new Error(`User with login or email already exists`);
|
|
157
|
+
}
|
|
158
|
+
throw error;
|
|
159
|
+
}
|
|
138
160
|
return this.toUserRecord(model);
|
|
139
161
|
}
|
|
140
162
|
async setPasswordHash(id, hash) {
|
|
141
|
-
await this.Users.update({ password: hash }, { where: { user_id: this.normalizeUserId(id) } });
|
|
163
|
+
const [affected] = await this.Users.update({ password: hash }, { where: { user_id: this.normalizeUserId(id) } });
|
|
164
|
+
if (affected === 0) {
|
|
165
|
+
throw new Error(`User ${String(id)} not found`);
|
|
166
|
+
}
|
|
142
167
|
}
|
|
143
168
|
getPasswordHash(user) {
|
|
144
169
|
return user.password;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|