huia-auth-core 1.0.0-alpha.16
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/cookie.d.ts +15 -0
- package/dist/cookie.d.ts.map +1 -0
- package/dist/cookie.js +60 -0
- package/dist/cookie.js.map +1 -0
- package/dist/headless-client.d.ts +106 -0
- package/dist/headless-client.d.ts.map +1 -0
- package/dist/headless-client.js +313 -0
- package/dist/headless-client.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/oidc-client.d.ts +46 -0
- package/dist/oidc-client.d.ts.map +1 -0
- package/dist/oidc-client.js +122 -0
- package/dist/oidc-client.js.map +1 -0
- package/dist/refresh.d.ts +15 -0
- package/dist/refresh.d.ts.map +1 -0
- package/dist/refresh.js +87 -0
- package/dist/refresh.js.map +1 -0
- package/dist/storage.d.ts +50 -0
- package/dist/storage.d.ts.map +1 -0
- package/dist/storage.js +140 -0
- package/dist/storage.js.map +1 -0
- package/dist/tokens.d.ts +18 -0
- package/dist/tokens.d.ts.map +1 -0
- package/dist/tokens.js +69 -0
- package/dist/tokens.js.map +1 -0
- package/dist/types.d.ts +179 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/package.json +43 -0
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared type definitions for Huia authentication libraries.
|
|
3
|
+
*/
|
|
4
|
+
export interface UserClaims {
|
|
5
|
+
sub?: string;
|
|
6
|
+
name?: string;
|
|
7
|
+
email?: string;
|
|
8
|
+
email_verified?: boolean;
|
|
9
|
+
preferred_username?: string;
|
|
10
|
+
given_name?: string;
|
|
11
|
+
family_name?: string;
|
|
12
|
+
phone_number?: string;
|
|
13
|
+
phone_number_verified?: boolean;
|
|
14
|
+
roles?: string[];
|
|
15
|
+
[key: string]: unknown;
|
|
16
|
+
}
|
|
17
|
+
export interface UserSession {
|
|
18
|
+
user?: UserClaims | null;
|
|
19
|
+
loggedIn?: boolean;
|
|
20
|
+
expiresAt?: number;
|
|
21
|
+
}
|
|
22
|
+
export interface TokenRecord {
|
|
23
|
+
sid: string;
|
|
24
|
+
accessToken: string;
|
|
25
|
+
refreshToken?: string;
|
|
26
|
+
idToken?: string;
|
|
27
|
+
claims: UserClaims;
|
|
28
|
+
scope?: string;
|
|
29
|
+
accessTokenExpiresAt: number;
|
|
30
|
+
refreshTokenExpiresAt?: number;
|
|
31
|
+
updatedAt: number;
|
|
32
|
+
}
|
|
33
|
+
export interface AuthStateRecord {
|
|
34
|
+
state: string;
|
|
35
|
+
codeVerifier: string;
|
|
36
|
+
nonce: string;
|
|
37
|
+
returnTo?: string;
|
|
38
|
+
createdAt: number;
|
|
39
|
+
}
|
|
40
|
+
export interface LockRecord {
|
|
41
|
+
lockId: string;
|
|
42
|
+
acquiredAt: number;
|
|
43
|
+
}
|
|
44
|
+
export interface CookiePayload {
|
|
45
|
+
sid: string;
|
|
46
|
+
user: UserClaims;
|
|
47
|
+
expiresAt: number;
|
|
48
|
+
tokens?: TokenRecord;
|
|
49
|
+
stateless?: boolean;
|
|
50
|
+
}
|
|
51
|
+
export interface SessionOptions {
|
|
52
|
+
name?: string;
|
|
53
|
+
password: string;
|
|
54
|
+
maxAge?: number;
|
|
55
|
+
userClaims?: string[];
|
|
56
|
+
/**
|
|
57
|
+
* When true, all session data (including tokens) is encrypted and stored directly inside a
|
|
58
|
+
* secure, HttpOnly cookie in the user's browser. The server does not keep track of who is logged in.
|
|
59
|
+
*/
|
|
60
|
+
stateless?: boolean;
|
|
61
|
+
}
|
|
62
|
+
export interface CookieOptions {
|
|
63
|
+
chunkSize?: number;
|
|
64
|
+
maxChunks?: number;
|
|
65
|
+
secure?: boolean;
|
|
66
|
+
sameSite?: 'lax' | 'strict' | 'none';
|
|
67
|
+
path?: string;
|
|
68
|
+
}
|
|
69
|
+
export interface HuiaStorageAdapter {
|
|
70
|
+
getTokenRecord(sid: string): Promise<TokenRecord | null>;
|
|
71
|
+
setTokenRecord(sid: string, record: TokenRecord, ttlSeconds?: number): Promise<void>;
|
|
72
|
+
deleteTokenRecord(sid: string): Promise<void>;
|
|
73
|
+
getStateRecord?(state: string): Promise<AuthStateRecord | null>;
|
|
74
|
+
setStateRecord?(state: string, record: AuthStateRecord, ttlSeconds?: number): Promise<void>;
|
|
75
|
+
deleteStateRecord?(state: string): Promise<void>;
|
|
76
|
+
getLock(sid: string): Promise<LockRecord | null>;
|
|
77
|
+
setLock(sid: string, lock: LockRecord, ttlSeconds?: number): Promise<void>;
|
|
78
|
+
deleteLock(sid: string): Promise<void>;
|
|
79
|
+
}
|
|
80
|
+
export interface BackendTokenResponse {
|
|
81
|
+
tokenType: string;
|
|
82
|
+
accessToken: string;
|
|
83
|
+
expiresIn: number;
|
|
84
|
+
refreshToken: string;
|
|
85
|
+
}
|
|
86
|
+
export interface BackendMeResponse {
|
|
87
|
+
email: string;
|
|
88
|
+
isEmailConfirmed: boolean;
|
|
89
|
+
roles?: string[];
|
|
90
|
+
firstName?: string;
|
|
91
|
+
lastName?: string;
|
|
92
|
+
phoneNumber?: string;
|
|
93
|
+
isPhoneNumberConfirmed?: boolean;
|
|
94
|
+
[key: string]: unknown;
|
|
95
|
+
}
|
|
96
|
+
export interface BackendPhoneStartResponse {
|
|
97
|
+
flowId: string;
|
|
98
|
+
expiresInSeconds: number;
|
|
99
|
+
status?: string;
|
|
100
|
+
}
|
|
101
|
+
export interface BackendPhoneVerifyResponse {
|
|
102
|
+
accessToken?: string;
|
|
103
|
+
refreshToken?: string;
|
|
104
|
+
expiresIn?: number;
|
|
105
|
+
requiresProfile?: boolean;
|
|
106
|
+
flowId?: string;
|
|
107
|
+
firstName?: string | null;
|
|
108
|
+
lastName?: string | null;
|
|
109
|
+
}
|
|
110
|
+
export interface BackendExternalExchangeResponse {
|
|
111
|
+
accessToken?: string;
|
|
112
|
+
refreshToken?: string;
|
|
113
|
+
expiresIn?: number;
|
|
114
|
+
requiresProfile?: boolean;
|
|
115
|
+
code?: string;
|
|
116
|
+
email?: string | null;
|
|
117
|
+
firstName?: string | null;
|
|
118
|
+
lastName?: string | null;
|
|
119
|
+
}
|
|
120
|
+
export interface HeadlessAdminUser {
|
|
121
|
+
id: string;
|
|
122
|
+
userName?: string | null;
|
|
123
|
+
email?: string | null;
|
|
124
|
+
emailConfirmed: boolean;
|
|
125
|
+
phoneNumber?: string | null;
|
|
126
|
+
phoneNumberConfirmed: boolean;
|
|
127
|
+
firstName: string;
|
|
128
|
+
lastName: string;
|
|
129
|
+
lockoutEnabled: boolean;
|
|
130
|
+
lockoutEnd?: string | null;
|
|
131
|
+
roles: string[];
|
|
132
|
+
}
|
|
133
|
+
export interface HeadlessAdminRole {
|
|
134
|
+
id: string;
|
|
135
|
+
name: string;
|
|
136
|
+
origin: string;
|
|
137
|
+
}
|
|
138
|
+
export interface HeadlessAdminUsersPage {
|
|
139
|
+
data: HeadlessAdminUser[];
|
|
140
|
+
totalCount: number;
|
|
141
|
+
page: number;
|
|
142
|
+
pageSize: number;
|
|
143
|
+
hasNext: boolean;
|
|
144
|
+
hasPrevious: boolean;
|
|
145
|
+
}
|
|
146
|
+
export interface CreateHeadlessAdminUserRequest {
|
|
147
|
+
email?: string;
|
|
148
|
+
password?: string;
|
|
149
|
+
phoneNumber?: string;
|
|
150
|
+
firstName?: string;
|
|
151
|
+
lastName?: string;
|
|
152
|
+
emailConfirmed?: boolean;
|
|
153
|
+
phoneNumberConfirmed?: boolean;
|
|
154
|
+
roles?: string[];
|
|
155
|
+
}
|
|
156
|
+
export interface UpdateHeadlessAdminUserRequest {
|
|
157
|
+
firstName?: string;
|
|
158
|
+
lastName?: string;
|
|
159
|
+
email?: string;
|
|
160
|
+
phoneNumber?: string;
|
|
161
|
+
}
|
|
162
|
+
export interface PasskeyDto {
|
|
163
|
+
id: string;
|
|
164
|
+
name?: string | null;
|
|
165
|
+
createdAt: string;
|
|
166
|
+
isBackedUp: boolean;
|
|
167
|
+
isUserVerified: boolean;
|
|
168
|
+
}
|
|
169
|
+
export interface PasskeyAssertionRequest {
|
|
170
|
+
credential: unknown;
|
|
171
|
+
}
|
|
172
|
+
export interface PasskeyRegistrationRequest {
|
|
173
|
+
credential: unknown;
|
|
174
|
+
name?: string;
|
|
175
|
+
}
|
|
176
|
+
export interface RenamePasskeyRequest {
|
|
177
|
+
name: string;
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
package/package.json
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "huia-auth-core",
|
|
3
|
+
"version": "1.0.0-alpha.16",
|
|
4
|
+
"description": "Shared authentication primitives for Huia client modules (Next.js & Nuxt 4)",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "git+https://github.com/Ayman-Elfaki/Huia.git",
|
|
10
|
+
"directory": "src/javascript/shared/huia-auth-core"
|
|
11
|
+
},
|
|
12
|
+
"exports": {
|
|
13
|
+
".": {
|
|
14
|
+
"types": "./dist/index.d.ts",
|
|
15
|
+
"import": "./dist/index.js"
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
"main": "./dist/index.js",
|
|
19
|
+
"types": "./dist/index.d.ts",
|
|
20
|
+
"files": [
|
|
21
|
+
"dist"
|
|
22
|
+
],
|
|
23
|
+
"scripts": {
|
|
24
|
+
"build": "tsc",
|
|
25
|
+
"dev": "tsc --watch",
|
|
26
|
+
"test": "vitest run",
|
|
27
|
+
"test:watch": "vitest --watch"
|
|
28
|
+
},
|
|
29
|
+
"dependencies": {
|
|
30
|
+
"ioredis": "^5.4.1",
|
|
31
|
+
"iron-webcrypto": "^1.2.1",
|
|
32
|
+
"openid-client": "^6.1.0",
|
|
33
|
+
"uncrypto": "^0.1.3"
|
|
34
|
+
},
|
|
35
|
+
"devDependencies": {
|
|
36
|
+
"@types/node": "^22.10.0",
|
|
37
|
+
"typescript": "~5.9.3",
|
|
38
|
+
"vitest": "^4.0.2"
|
|
39
|
+
},
|
|
40
|
+
"engines": {
|
|
41
|
+
"node": ">=20.11.0"
|
|
42
|
+
}
|
|
43
|
+
}
|