@absolutejs/auth 0.27.0-beta.0 → 0.27.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/dist/adaptive/config.d.ts +22 -0
- package/dist/adaptive/inMemoryStores.d.ts +3 -0
- package/dist/adaptive/postgresStores.d.ts +293 -0
- package/dist/adaptive/types.d.ts +50 -0
- package/dist/apikeys/config.d.ts +64 -0
- package/dist/apikeys/inMemoryStores.d.ts +4 -0
- package/dist/apikeys/postgresStores.d.ts +507 -0
- package/dist/apikeys/routes.d.ts +83 -0
- package/dist/apikeys/types.d.ts +53 -0
- package/dist/index.d.ts +41 -4
- package/dist/index.js +2143 -1372
- package/dist/index.js.map +28 -20
- package/dist/mfa/rotation.d.ts +17 -0
- package/dist/mfa/types.d.ts +1 -0
- package/dist/portal/routes.d.ts +1 -1
- package/dist/types.d.ts +8 -0
- package/package.json +1 -1
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { KnownDeviceStore, LoginHistoryStore, RiskAction, RiskAssessment, RiskContext, RiskSignal } from './types';
|
|
2
|
+
export type AdaptiveConfig = {
|
|
3
|
+
historyLimit?: number;
|
|
4
|
+
knownDeviceStore: KnownDeviceStore;
|
|
5
|
+
loginHistoryStore: LoginHistoryStore;
|
|
6
|
+
maxTravelKmh?: number;
|
|
7
|
+
rules?: Partial<Record<RiskSignal, RiskAction>>;
|
|
8
|
+
velocityMaxAttempts?: number;
|
|
9
|
+
velocityWindowMs?: number;
|
|
10
|
+
};
|
|
11
|
+
export declare const assessRisk: (config: AdaptiveConfig, context: RiskContext) => Promise<RiskAssessment>;
|
|
12
|
+
export declare const createRiskEngine: (config: AdaptiveConfig) => {
|
|
13
|
+
assessRisk: (context: RiskContext) => Promise<RiskAssessment>;
|
|
14
|
+
recordAttempt: (context: RiskContext & {
|
|
15
|
+
outcome: RiskAction;
|
|
16
|
+
}) => Promise<void>;
|
|
17
|
+
trustDevice: (userId: string, deviceId: string, label?: string) => Promise<void>;
|
|
18
|
+
};
|
|
19
|
+
export declare const recordLoginAttempt: (config: AdaptiveConfig, context: RiskContext & {
|
|
20
|
+
outcome: RiskAction;
|
|
21
|
+
}) => Promise<void>;
|
|
22
|
+
export declare const trustDevice: (config: AdaptiveConfig, userId: string, deviceId: string, label?: string) => Promise<void>;
|
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
import { type AnyPgDatabase } from '../stores/postgres';
|
|
2
|
+
import type { KnownDeviceStore, LoginHistoryStore } from './types';
|
|
3
|
+
export declare const knownDevicesTable: import("drizzle-orm/pg-core").PgTableWithColumns<{
|
|
4
|
+
name: "auth_known_devices";
|
|
5
|
+
schema: undefined;
|
|
6
|
+
columns: {
|
|
7
|
+
device_id: import("drizzle-orm/pg-core").PgColumn<{
|
|
8
|
+
name: "device_id";
|
|
9
|
+
tableName: "auth_known_devices";
|
|
10
|
+
dataType: "string";
|
|
11
|
+
columnType: "PgVarchar";
|
|
12
|
+
data: string;
|
|
13
|
+
driverParam: string;
|
|
14
|
+
notNull: true;
|
|
15
|
+
hasDefault: false;
|
|
16
|
+
isPrimaryKey: false;
|
|
17
|
+
isAutoincrement: false;
|
|
18
|
+
hasRuntimeDefault: false;
|
|
19
|
+
enumValues: [string, ...string[]];
|
|
20
|
+
baseColumn: never;
|
|
21
|
+
identity: undefined;
|
|
22
|
+
generated: undefined;
|
|
23
|
+
}, {}, {
|
|
24
|
+
length: 255;
|
|
25
|
+
}>;
|
|
26
|
+
first_seen_at_ms: import("drizzle-orm/pg-core").PgColumn<{
|
|
27
|
+
name: "first_seen_at_ms";
|
|
28
|
+
tableName: "auth_known_devices";
|
|
29
|
+
dataType: "number";
|
|
30
|
+
columnType: "PgBigInt53";
|
|
31
|
+
data: number;
|
|
32
|
+
driverParam: string | number;
|
|
33
|
+
notNull: true;
|
|
34
|
+
hasDefault: false;
|
|
35
|
+
isPrimaryKey: false;
|
|
36
|
+
isAutoincrement: false;
|
|
37
|
+
hasRuntimeDefault: false;
|
|
38
|
+
enumValues: undefined;
|
|
39
|
+
baseColumn: never;
|
|
40
|
+
identity: undefined;
|
|
41
|
+
generated: undefined;
|
|
42
|
+
}, {}, {}>;
|
|
43
|
+
label: import("drizzle-orm/pg-core").PgColumn<{
|
|
44
|
+
name: "label";
|
|
45
|
+
tableName: "auth_known_devices";
|
|
46
|
+
dataType: "string";
|
|
47
|
+
columnType: "PgVarchar";
|
|
48
|
+
data: string;
|
|
49
|
+
driverParam: string;
|
|
50
|
+
notNull: false;
|
|
51
|
+
hasDefault: false;
|
|
52
|
+
isPrimaryKey: false;
|
|
53
|
+
isAutoincrement: false;
|
|
54
|
+
hasRuntimeDefault: false;
|
|
55
|
+
enumValues: [string, ...string[]];
|
|
56
|
+
baseColumn: never;
|
|
57
|
+
identity: undefined;
|
|
58
|
+
generated: undefined;
|
|
59
|
+
}, {}, {
|
|
60
|
+
length: 255;
|
|
61
|
+
}>;
|
|
62
|
+
last_seen_at_ms: import("drizzle-orm/pg-core").PgColumn<{
|
|
63
|
+
name: "last_seen_at_ms";
|
|
64
|
+
tableName: "auth_known_devices";
|
|
65
|
+
dataType: "number";
|
|
66
|
+
columnType: "PgBigInt53";
|
|
67
|
+
data: number;
|
|
68
|
+
driverParam: string | number;
|
|
69
|
+
notNull: true;
|
|
70
|
+
hasDefault: false;
|
|
71
|
+
isPrimaryKey: false;
|
|
72
|
+
isAutoincrement: false;
|
|
73
|
+
hasRuntimeDefault: false;
|
|
74
|
+
enumValues: undefined;
|
|
75
|
+
baseColumn: never;
|
|
76
|
+
identity: undefined;
|
|
77
|
+
generated: undefined;
|
|
78
|
+
}, {}, {}>;
|
|
79
|
+
trusted: import("drizzle-orm/pg-core").PgColumn<{
|
|
80
|
+
name: "trusted";
|
|
81
|
+
tableName: "auth_known_devices";
|
|
82
|
+
dataType: "boolean";
|
|
83
|
+
columnType: "PgBoolean";
|
|
84
|
+
data: boolean;
|
|
85
|
+
driverParam: boolean;
|
|
86
|
+
notNull: true;
|
|
87
|
+
hasDefault: true;
|
|
88
|
+
isPrimaryKey: false;
|
|
89
|
+
isAutoincrement: false;
|
|
90
|
+
hasRuntimeDefault: false;
|
|
91
|
+
enumValues: undefined;
|
|
92
|
+
baseColumn: never;
|
|
93
|
+
identity: undefined;
|
|
94
|
+
generated: undefined;
|
|
95
|
+
}, {}, {}>;
|
|
96
|
+
user_id: import("drizzle-orm/pg-core").PgColumn<{
|
|
97
|
+
name: "user_id";
|
|
98
|
+
tableName: "auth_known_devices";
|
|
99
|
+
dataType: "string";
|
|
100
|
+
columnType: "PgVarchar";
|
|
101
|
+
data: string;
|
|
102
|
+
driverParam: string;
|
|
103
|
+
notNull: true;
|
|
104
|
+
hasDefault: false;
|
|
105
|
+
isPrimaryKey: false;
|
|
106
|
+
isAutoincrement: false;
|
|
107
|
+
hasRuntimeDefault: false;
|
|
108
|
+
enumValues: [string, ...string[]];
|
|
109
|
+
baseColumn: never;
|
|
110
|
+
identity: undefined;
|
|
111
|
+
generated: undefined;
|
|
112
|
+
}, {}, {
|
|
113
|
+
length: 255;
|
|
114
|
+
}>;
|
|
115
|
+
};
|
|
116
|
+
dialect: "pg";
|
|
117
|
+
}>;
|
|
118
|
+
export declare const loginHistoryTable: import("drizzle-orm/pg-core").PgTableWithColumns<{
|
|
119
|
+
name: "auth_login_history";
|
|
120
|
+
schema: undefined;
|
|
121
|
+
columns: {
|
|
122
|
+
attempt_id: import("drizzle-orm/pg-core").PgColumn<{
|
|
123
|
+
name: "attempt_id";
|
|
124
|
+
tableName: "auth_login_history";
|
|
125
|
+
dataType: "string";
|
|
126
|
+
columnType: "PgVarchar";
|
|
127
|
+
data: string;
|
|
128
|
+
driverParam: string;
|
|
129
|
+
notNull: true;
|
|
130
|
+
hasDefault: false;
|
|
131
|
+
isPrimaryKey: true;
|
|
132
|
+
isAutoincrement: false;
|
|
133
|
+
hasRuntimeDefault: false;
|
|
134
|
+
enumValues: [string, ...string[]];
|
|
135
|
+
baseColumn: never;
|
|
136
|
+
identity: undefined;
|
|
137
|
+
generated: undefined;
|
|
138
|
+
}, {}, {
|
|
139
|
+
length: 255;
|
|
140
|
+
}>;
|
|
141
|
+
country: import("drizzle-orm/pg-core").PgColumn<{
|
|
142
|
+
name: "country";
|
|
143
|
+
tableName: "auth_login_history";
|
|
144
|
+
dataType: "string";
|
|
145
|
+
columnType: "PgVarchar";
|
|
146
|
+
data: string;
|
|
147
|
+
driverParam: string;
|
|
148
|
+
notNull: false;
|
|
149
|
+
hasDefault: false;
|
|
150
|
+
isPrimaryKey: false;
|
|
151
|
+
isAutoincrement: false;
|
|
152
|
+
hasRuntimeDefault: false;
|
|
153
|
+
enumValues: [string, ...string[]];
|
|
154
|
+
baseColumn: never;
|
|
155
|
+
identity: undefined;
|
|
156
|
+
generated: undefined;
|
|
157
|
+
}, {}, {
|
|
158
|
+
length: 255;
|
|
159
|
+
}>;
|
|
160
|
+
device_id: import("drizzle-orm/pg-core").PgColumn<{
|
|
161
|
+
name: "device_id";
|
|
162
|
+
tableName: "auth_login_history";
|
|
163
|
+
dataType: "string";
|
|
164
|
+
columnType: "PgVarchar";
|
|
165
|
+
data: string;
|
|
166
|
+
driverParam: string;
|
|
167
|
+
notNull: true;
|
|
168
|
+
hasDefault: false;
|
|
169
|
+
isPrimaryKey: false;
|
|
170
|
+
isAutoincrement: false;
|
|
171
|
+
hasRuntimeDefault: false;
|
|
172
|
+
enumValues: [string, ...string[]];
|
|
173
|
+
baseColumn: never;
|
|
174
|
+
identity: undefined;
|
|
175
|
+
generated: undefined;
|
|
176
|
+
}, {}, {
|
|
177
|
+
length: 255;
|
|
178
|
+
}>;
|
|
179
|
+
ip_address: import("drizzle-orm/pg-core").PgColumn<{
|
|
180
|
+
name: "ip_address";
|
|
181
|
+
tableName: "auth_login_history";
|
|
182
|
+
dataType: "string";
|
|
183
|
+
columnType: "PgVarchar";
|
|
184
|
+
data: string;
|
|
185
|
+
driverParam: string;
|
|
186
|
+
notNull: false;
|
|
187
|
+
hasDefault: false;
|
|
188
|
+
isPrimaryKey: false;
|
|
189
|
+
isAutoincrement: false;
|
|
190
|
+
hasRuntimeDefault: false;
|
|
191
|
+
enumValues: [string, ...string[]];
|
|
192
|
+
baseColumn: never;
|
|
193
|
+
identity: undefined;
|
|
194
|
+
generated: undefined;
|
|
195
|
+
}, {}, {
|
|
196
|
+
length: 255;
|
|
197
|
+
}>;
|
|
198
|
+
latitude: import("drizzle-orm/pg-core").PgColumn<{
|
|
199
|
+
name: "latitude";
|
|
200
|
+
tableName: "auth_login_history";
|
|
201
|
+
dataType: "number";
|
|
202
|
+
columnType: "PgDoublePrecision";
|
|
203
|
+
data: number;
|
|
204
|
+
driverParam: string | number;
|
|
205
|
+
notNull: false;
|
|
206
|
+
hasDefault: false;
|
|
207
|
+
isPrimaryKey: false;
|
|
208
|
+
isAutoincrement: false;
|
|
209
|
+
hasRuntimeDefault: false;
|
|
210
|
+
enumValues: undefined;
|
|
211
|
+
baseColumn: never;
|
|
212
|
+
identity: undefined;
|
|
213
|
+
generated: undefined;
|
|
214
|
+
}, {}, {}>;
|
|
215
|
+
longitude: import("drizzle-orm/pg-core").PgColumn<{
|
|
216
|
+
name: "longitude";
|
|
217
|
+
tableName: "auth_login_history";
|
|
218
|
+
dataType: "number";
|
|
219
|
+
columnType: "PgDoublePrecision";
|
|
220
|
+
data: number;
|
|
221
|
+
driverParam: string | number;
|
|
222
|
+
notNull: false;
|
|
223
|
+
hasDefault: false;
|
|
224
|
+
isPrimaryKey: false;
|
|
225
|
+
isAutoincrement: false;
|
|
226
|
+
hasRuntimeDefault: false;
|
|
227
|
+
enumValues: undefined;
|
|
228
|
+
baseColumn: never;
|
|
229
|
+
identity: undefined;
|
|
230
|
+
generated: undefined;
|
|
231
|
+
}, {}, {}>;
|
|
232
|
+
outcome: import("drizzle-orm/pg-core").PgColumn<{
|
|
233
|
+
name: "outcome";
|
|
234
|
+
tableName: "auth_login_history";
|
|
235
|
+
dataType: "string";
|
|
236
|
+
columnType: "PgVarchar";
|
|
237
|
+
data: string;
|
|
238
|
+
driverParam: string;
|
|
239
|
+
notNull: true;
|
|
240
|
+
hasDefault: false;
|
|
241
|
+
isPrimaryKey: false;
|
|
242
|
+
isAutoincrement: false;
|
|
243
|
+
hasRuntimeDefault: false;
|
|
244
|
+
enumValues: [string, ...string[]];
|
|
245
|
+
baseColumn: never;
|
|
246
|
+
identity: undefined;
|
|
247
|
+
generated: undefined;
|
|
248
|
+
}, {}, {
|
|
249
|
+
length: 255;
|
|
250
|
+
}>;
|
|
251
|
+
timestamp_ms: import("drizzle-orm/pg-core").PgColumn<{
|
|
252
|
+
name: "timestamp_ms";
|
|
253
|
+
tableName: "auth_login_history";
|
|
254
|
+
dataType: "number";
|
|
255
|
+
columnType: "PgBigInt53";
|
|
256
|
+
data: number;
|
|
257
|
+
driverParam: string | number;
|
|
258
|
+
notNull: true;
|
|
259
|
+
hasDefault: false;
|
|
260
|
+
isPrimaryKey: false;
|
|
261
|
+
isAutoincrement: false;
|
|
262
|
+
hasRuntimeDefault: false;
|
|
263
|
+
enumValues: undefined;
|
|
264
|
+
baseColumn: never;
|
|
265
|
+
identity: undefined;
|
|
266
|
+
generated: undefined;
|
|
267
|
+
}, {}, {}>;
|
|
268
|
+
user_id: import("drizzle-orm/pg-core").PgColumn<{
|
|
269
|
+
name: "user_id";
|
|
270
|
+
tableName: "auth_login_history";
|
|
271
|
+
dataType: "string";
|
|
272
|
+
columnType: "PgVarchar";
|
|
273
|
+
data: string;
|
|
274
|
+
driverParam: string;
|
|
275
|
+
notNull: true;
|
|
276
|
+
hasDefault: false;
|
|
277
|
+
isPrimaryKey: false;
|
|
278
|
+
isAutoincrement: false;
|
|
279
|
+
hasRuntimeDefault: false;
|
|
280
|
+
enumValues: [string, ...string[]];
|
|
281
|
+
baseColumn: never;
|
|
282
|
+
identity: undefined;
|
|
283
|
+
generated: undefined;
|
|
284
|
+
}, {}, {
|
|
285
|
+
length: 255;
|
|
286
|
+
}>;
|
|
287
|
+
};
|
|
288
|
+
dialect: "pg";
|
|
289
|
+
}>;
|
|
290
|
+
export declare const createNeonKnownDeviceStore: (databaseUrl: string) => KnownDeviceStore;
|
|
291
|
+
export declare const createNeonLoginHistoryStore: (databaseUrl: string) => LoginHistoryStore;
|
|
292
|
+
export declare const createPostgresKnownDeviceStore: (db: AnyPgDatabase) => KnownDeviceStore;
|
|
293
|
+
export declare const createPostgresLoginHistoryStore: (db: AnyPgDatabase) => LoginHistoryStore;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
export type RiskAction = 'allow' | 'deny' | 'step_up';
|
|
2
|
+
export type RiskSignal = 'impossible_travel' | 'new_country' | 'new_device' | 'velocity';
|
|
3
|
+
export type GeoPoint = {
|
|
4
|
+
country?: string;
|
|
5
|
+
latitude?: number;
|
|
6
|
+
longitude?: number;
|
|
7
|
+
};
|
|
8
|
+
export type RiskContext = {
|
|
9
|
+
deviceId: string;
|
|
10
|
+
geo?: GeoPoint;
|
|
11
|
+
ipAddress?: string;
|
|
12
|
+
now?: number;
|
|
13
|
+
userId: string;
|
|
14
|
+
};
|
|
15
|
+
export type RiskReason = {
|
|
16
|
+
action: RiskAction;
|
|
17
|
+
signal: RiskSignal;
|
|
18
|
+
};
|
|
19
|
+
export type RiskAssessment = {
|
|
20
|
+
action: RiskAction;
|
|
21
|
+
reasons: RiskReason[];
|
|
22
|
+
};
|
|
23
|
+
export type KnownDevice = {
|
|
24
|
+
deviceId: string;
|
|
25
|
+
firstSeenAt: number;
|
|
26
|
+
label?: string;
|
|
27
|
+
lastSeenAt: number;
|
|
28
|
+
trusted: boolean;
|
|
29
|
+
userId: string;
|
|
30
|
+
};
|
|
31
|
+
export type KnownDeviceStore = {
|
|
32
|
+
findDevice: (userId: string, deviceId: string) => Promise<KnownDevice | undefined>;
|
|
33
|
+
listDevices: (userId: string) => Promise<KnownDevice[]>;
|
|
34
|
+
saveDevice: (device: KnownDevice) => Promise<void>;
|
|
35
|
+
};
|
|
36
|
+
export type LoginAttempt = {
|
|
37
|
+
attemptId: string;
|
|
38
|
+
country?: string;
|
|
39
|
+
deviceId: string;
|
|
40
|
+
ipAddress?: string;
|
|
41
|
+
latitude?: number;
|
|
42
|
+
longitude?: number;
|
|
43
|
+
outcome: RiskAction;
|
|
44
|
+
timestamp: number;
|
|
45
|
+
userId: string;
|
|
46
|
+
};
|
|
47
|
+
export type LoginHistoryStore = {
|
|
48
|
+
listRecent: (userId: string, limit: number) => Promise<LoginAttempt[]>;
|
|
49
|
+
recordAttempt: (attempt: LoginAttempt) => Promise<void>;
|
|
50
|
+
};
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import type { RouteString } from '../types';
|
|
2
|
+
import type { AccessTokenStore, ApiClient, ApiClientStore, ApiKey, ApiKeyStore, ApiPrincipal } from './types';
|
|
3
|
+
export declare const DEFAULT_TOKEN_ROUTE: RouteString;
|
|
4
|
+
export type ApiKeysConfig = {
|
|
5
|
+
/** Where minted access tokens live — required (with `apiClientStore`) for the
|
|
6
|
+
* client_credentials grant to be mounted. */
|
|
7
|
+
accessTokenStore?: AccessTokenStore;
|
|
8
|
+
/** Lifetime of a minted access token (defaults to one hour). */
|
|
9
|
+
accessTokenTtlMs?: number;
|
|
10
|
+
/** Registered M2M clients — required (with `accessTokenStore`) for the
|
|
11
|
+
* client_credentials grant. */
|
|
12
|
+
apiClientStore?: ApiClientStore;
|
|
13
|
+
/** Static API keys. Used by the exported `verifyApiKey` / `resolveApiPrincipal`
|
|
14
|
+
* helpers; the consumer wires its own management + guard routes. */
|
|
15
|
+
apiKeyStore?: ApiKeyStore;
|
|
16
|
+
/** Path of the client_credentials token endpoint (defaults to `/oauth2/token`). */
|
|
17
|
+
tokenRoute?: RouteString;
|
|
18
|
+
};
|
|
19
|
+
export type ClientCredentialsResult = {
|
|
20
|
+
error: 'invalid_client' | 'invalid_scope';
|
|
21
|
+
ok: false;
|
|
22
|
+
} | {
|
|
23
|
+
accessToken: string;
|
|
24
|
+
expiresIn: number;
|
|
25
|
+
ok: true;
|
|
26
|
+
scopes: string[];
|
|
27
|
+
};
|
|
28
|
+
export declare const createApiClient: (apiClientStore: ApiClientStore, options: {
|
|
29
|
+
name: string;
|
|
30
|
+
ownerId?: string;
|
|
31
|
+
scopes?: string[];
|
|
32
|
+
}) => Promise<{
|
|
33
|
+
clientId: string;
|
|
34
|
+
clientSecret: string;
|
|
35
|
+
record: ApiClient;
|
|
36
|
+
}>;
|
|
37
|
+
export declare const createApiKey: (apiKeyStore: ApiKeyStore, options: {
|
|
38
|
+
expiresAt?: number;
|
|
39
|
+
name: string;
|
|
40
|
+
ownerId?: string;
|
|
41
|
+
scopes?: string[];
|
|
42
|
+
}) => Promise<{
|
|
43
|
+
key: string;
|
|
44
|
+
record: ApiKey;
|
|
45
|
+
}>;
|
|
46
|
+
export declare const exchangeClientCredentials: ({ accessTokenStore, apiClientStore, clientId, clientSecret, now, requestedScopes, ttlMs }: {
|
|
47
|
+
accessTokenStore: AccessTokenStore;
|
|
48
|
+
apiClientStore: ApiClientStore;
|
|
49
|
+
clientId: string;
|
|
50
|
+
clientSecret: string;
|
|
51
|
+
now?: number;
|
|
52
|
+
requestedScopes?: string[];
|
|
53
|
+
ttlMs?: number;
|
|
54
|
+
}) => Promise<ClientCredentialsResult>;
|
|
55
|
+
export declare const hasScopes: (principal: ApiPrincipal | undefined, required: string[]) => boolean;
|
|
56
|
+
export declare const resolveApiPrincipal: ({ accessTokenStore, apiKey, apiKeyStore, authorization, now }: {
|
|
57
|
+
accessTokenStore?: AccessTokenStore;
|
|
58
|
+
apiKey?: string;
|
|
59
|
+
apiKeyStore?: ApiKeyStore;
|
|
60
|
+
authorization?: string;
|
|
61
|
+
now?: number;
|
|
62
|
+
}) => Promise<ApiPrincipal | undefined>;
|
|
63
|
+
export declare const verifyAccessToken: (accessTokenStore: AccessTokenStore, presented: string, now?: number) => Promise<import("./types").AccessToken | undefined>;
|
|
64
|
+
export declare const verifyApiKey: (apiKeyStore: ApiKeyStore, presented: string, now?: number) => Promise<ApiKey | undefined>;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { AccessTokenStore, ApiClientStore, ApiKeyStore } from './types';
|
|
2
|
+
export declare const createInMemoryAccessTokenStore: () => AccessTokenStore;
|
|
3
|
+
export declare const createInMemoryApiClientStore: () => ApiClientStore;
|
|
4
|
+
export declare const createInMemoryApiKeyStore: () => ApiKeyStore;
|