better-auth 0.0.2-beta.7 → 0.0.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/access.d.ts +4 -0
- package/dist/access.js +126 -0
- package/dist/access.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +553 -0
- package/dist/cli.js.map +1 -0
- package/dist/client/plugins.d.ts +2436 -0
- package/dist/client/plugins.js +411 -0
- package/dist/client/plugins.js.map +1 -0
- package/dist/client-A2Mt04KQ.d.ts +3503 -0
- package/dist/client.d.ts +1433 -0
- package/dist/client.js +693 -0
- package/dist/client.js.map +1 -0
- package/dist/helper-B5_2Vzba.d.ts +14 -0
- package/dist/index-Dg4eEXZW.d.ts +24 -0
- package/dist/index-W5nXvJ-p.d.ts +1498 -0
- package/dist/index.d.ts +6 -4
- package/dist/index.js +2195 -1191
- package/dist/index.js.map +1 -1
- package/dist/next-js.d.ts +14 -0
- package/dist/next-js.js +14 -0
- package/dist/next-js.js.map +1 -0
- package/dist/plugins.d.ts +892 -49
- package/dist/plugins.js +3951 -253
- package/dist/plugins.js.map +1 -1
- package/dist/preact.d.ts +8 -0
- package/dist/preact.js +294 -0
- package/dist/preact.js.map +1 -0
- package/dist/react.d.ts +14 -0
- package/dist/react.js +314 -0
- package/dist/react.js.map +1 -0
- package/dist/schema-BOszzrbQ.d.ts +792 -0
- package/dist/social.d.ts +4 -0
- package/dist/social.js +509 -0
- package/dist/social.js.map +1 -0
- package/dist/solid-start.d.ts +18 -0
- package/dist/solid-start.js +14 -0
- package/dist/solid-start.js.map +1 -0
- package/dist/solid.d.ts +2790 -0
- package/dist/solid.js +306 -0
- package/dist/solid.js.map +1 -0
- package/dist/statement-COylZd3J.d.ts +81 -0
- package/dist/svelte-kit.d.ts +10 -7
- package/dist/svelte-kit.js +12 -17
- package/dist/svelte-kit.js.map +1 -1
- package/dist/svelte.d.ts +2791 -0
- package/dist/svelte.js +304 -0
- package/dist/svelte.js.map +1 -0
- package/dist/type-DbMyI3b5.d.ts +5724 -0
- package/dist/types.d.ts +7 -0
- package/dist/types.js +1 -0
- package/dist/types.js.map +1 -0
- package/dist/vue.d.ts +14 -0
- package/dist/vue.js +311 -0
- package/dist/vue.js.map +1 -0
- package/package.json +80 -54
- package/LICENSE +0 -21
- package/dist/actions.d.ts +0 -33
- package/dist/actions.js +0 -1373
- package/dist/actions.js.map +0 -1
- package/dist/adapters/drizzle-adapter.d.ts +0 -10
- package/dist/adapters/drizzle-adapter.js +0 -1095
- package/dist/adapters/drizzle-adapter.js.map +0 -1
- package/dist/adapters/memory.d.ts +0 -8
- package/dist/adapters/memory.js +0 -136
- package/dist/adapters/memory.js.map +0 -1
- package/dist/adapters/mongodb-adapter.d.ts +0 -9
- package/dist/adapters/mongodb-adapter.js +0 -97
- package/dist/adapters/mongodb-adapter.js.map +0 -1
- package/dist/adapters/prisma-adapter.d.ts +0 -7
- package/dist/adapters/prisma-adapter.js +0 -144
- package/dist/adapters/prisma-adapter.js.map +0 -1
- package/dist/adapters/redis-adapter.d.ts +0 -7
- package/dist/adapters/redis-adapter.js +0 -65
- package/dist/adapters/redis-adapter.js.map +0 -1
- package/dist/adapters.d.ts +0 -3
- package/dist/adapters.js +0 -206
- package/dist/adapters.js.map +0 -1
- package/dist/h3.d.ts +0 -10
- package/dist/h3.js +0 -326
- package/dist/h3.js.map +0 -1
- package/dist/hono.d.ts +0 -10
- package/dist/hono.js +0 -25
- package/dist/hono.js.map +0 -1
- package/dist/index-UcTu1vUg.d.ts +0 -107
- package/dist/next.d.ts +0 -17
- package/dist/next.js +0 -26
- package/dist/next.js.map +0 -1
- package/dist/options-CH15FEBw.d.ts +0 -1562
- package/dist/providers.d.ts +0 -3
- package/dist/providers.js +0 -653
- package/dist/providers.js.map +0 -1
- package/dist/routes/session.d.ts +0 -39
- package/dist/routes/session.js +0 -128
- package/dist/routes/session.js.map +0 -1
- package/dist/types-DAxaMWCy.d.ts +0 -136
|
@@ -0,0 +1,411 @@
|
|
|
1
|
+
// src/client/create-client-plugin.ts
|
|
2
|
+
var createClientPlugin = () => {
|
|
3
|
+
return ($fn) => {
|
|
4
|
+
return ($fetch) => {
|
|
5
|
+
const data = $fn($fetch);
|
|
6
|
+
return {
|
|
7
|
+
...data,
|
|
8
|
+
integrations: data.integrations,
|
|
9
|
+
plugin: {}
|
|
10
|
+
};
|
|
11
|
+
};
|
|
12
|
+
};
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
// src/plugins/two-factor/client.ts
|
|
16
|
+
var twoFactorClient = (options = {
|
|
17
|
+
redirect: true,
|
|
18
|
+
twoFactorPage: "/"
|
|
19
|
+
}) => {
|
|
20
|
+
return createClientPlugin()(($fetch) => {
|
|
21
|
+
return {
|
|
22
|
+
id: "two-factor",
|
|
23
|
+
authProxySignal: [
|
|
24
|
+
{
|
|
25
|
+
matcher: (path) => path === "/two-factor/enable" || path === "/two-factor/send-otp",
|
|
26
|
+
atom: "$sessionSignal"
|
|
27
|
+
}
|
|
28
|
+
],
|
|
29
|
+
pathMethods: {
|
|
30
|
+
"enable/totp": "POST",
|
|
31
|
+
"/two-factor/disable": "POST",
|
|
32
|
+
"/two-factor/enable": "POST",
|
|
33
|
+
"/two-factor/send-otp": "POST"
|
|
34
|
+
},
|
|
35
|
+
fetchPlugins: [
|
|
36
|
+
{
|
|
37
|
+
id: "two-factor",
|
|
38
|
+
name: "two-factor",
|
|
39
|
+
hooks: {
|
|
40
|
+
async onSuccess(context) {
|
|
41
|
+
if (context.data?.twoFactorRedirect) {
|
|
42
|
+
if (options.redirect) {
|
|
43
|
+
window.location.href = options.twoFactorPage;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
]
|
|
50
|
+
};
|
|
51
|
+
});
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
// src/plugins/organization/client.ts
|
|
55
|
+
import { atom, computed, task } from "nanostores";
|
|
56
|
+
|
|
57
|
+
// src/plugins/organization/access/src/access.ts
|
|
58
|
+
var ParsingError = class extends Error {
|
|
59
|
+
path;
|
|
60
|
+
constructor(message, path) {
|
|
61
|
+
super(message);
|
|
62
|
+
this.path = path;
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
var AccessControl = class {
|
|
66
|
+
constructor(s) {
|
|
67
|
+
this.s = s;
|
|
68
|
+
this.statements = s;
|
|
69
|
+
}
|
|
70
|
+
statements;
|
|
71
|
+
newRole(statements) {
|
|
72
|
+
return new Role(statements);
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
var Role = class _Role {
|
|
76
|
+
statements;
|
|
77
|
+
constructor(statements) {
|
|
78
|
+
this.statements = statements;
|
|
79
|
+
}
|
|
80
|
+
authorize(request, connector) {
|
|
81
|
+
for (const [requestedResource, requestedActions] of Object.entries(
|
|
82
|
+
request
|
|
83
|
+
)) {
|
|
84
|
+
const allowedActions = this.statements[requestedResource];
|
|
85
|
+
if (!allowedActions) {
|
|
86
|
+
return {
|
|
87
|
+
success: false,
|
|
88
|
+
error: `You are not allowed to access resource: ${requestedResource}`
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
const success = connector === "OR" ? requestedActions.some(
|
|
92
|
+
(requestedAction) => allowedActions.includes(requestedAction)
|
|
93
|
+
) : requestedActions.every(
|
|
94
|
+
(requestedAction) => allowedActions.includes(requestedAction)
|
|
95
|
+
);
|
|
96
|
+
if (success) {
|
|
97
|
+
return { success };
|
|
98
|
+
}
|
|
99
|
+
return {
|
|
100
|
+
success: false,
|
|
101
|
+
error: `unauthorized to access resource "${requestedResource}"`
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
return {
|
|
105
|
+
success: false,
|
|
106
|
+
error: "Not authorized"
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
static fromString(s) {
|
|
110
|
+
const statements = JSON.parse(s);
|
|
111
|
+
if (typeof statements !== "object") {
|
|
112
|
+
throw new ParsingError("statements is not an object", ".");
|
|
113
|
+
}
|
|
114
|
+
for (const [resource, actions] of Object.entries(statements)) {
|
|
115
|
+
if (typeof resource !== "string") {
|
|
116
|
+
throw new ParsingError("invalid resource identifier", resource);
|
|
117
|
+
}
|
|
118
|
+
if (!Array.isArray(actions)) {
|
|
119
|
+
throw new ParsingError("actions is not an array", resource);
|
|
120
|
+
}
|
|
121
|
+
for (let i = 0; i < actions.length; i++) {
|
|
122
|
+
if (typeof actions[i] !== "string") {
|
|
123
|
+
throw new ParsingError("action is not a string", `${resource}[${i}]`);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return new _Role(statements);
|
|
128
|
+
}
|
|
129
|
+
toString() {
|
|
130
|
+
return JSON.stringify(this.statements);
|
|
131
|
+
}
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
// src/plugins/organization/access/statement.ts
|
|
135
|
+
var createAccessControl = (statements) => {
|
|
136
|
+
return new AccessControl(statements);
|
|
137
|
+
};
|
|
138
|
+
var defaultStatements = {
|
|
139
|
+
organization: ["update", "delete"],
|
|
140
|
+
member: ["create", "update", "delete"],
|
|
141
|
+
invitation: ["create", "cancel"]
|
|
142
|
+
};
|
|
143
|
+
var defaultAc = createAccessControl(defaultStatements);
|
|
144
|
+
var adminAc = defaultAc.newRole({
|
|
145
|
+
organization: ["update"],
|
|
146
|
+
invitation: ["create", "cancel"],
|
|
147
|
+
member: ["create", "update", "delete"]
|
|
148
|
+
});
|
|
149
|
+
var ownerAc = defaultAc.newRole({
|
|
150
|
+
organization: ["update", "delete"],
|
|
151
|
+
member: ["create", "update", "delete"],
|
|
152
|
+
invitation: ["create", "cancel"]
|
|
153
|
+
});
|
|
154
|
+
var memberAc = defaultAc.newRole({
|
|
155
|
+
organization: [],
|
|
156
|
+
member: [],
|
|
157
|
+
invitation: []
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
// src/plugins/organization/client.ts
|
|
161
|
+
var organizationClient = (options) => createClientPlugin()(($fetch) => {
|
|
162
|
+
const activeOrgId = atom(null);
|
|
163
|
+
const $listOrg = atom(false);
|
|
164
|
+
const $activeOrgSignal = atom(false);
|
|
165
|
+
const $activeOrganization = computed(
|
|
166
|
+
[activeOrgId, $activeOrgSignal],
|
|
167
|
+
() => task(async () => {
|
|
168
|
+
if (!activeOrgId.get()) {
|
|
169
|
+
return null;
|
|
170
|
+
}
|
|
171
|
+
const organization = await $fetch("/organization/set-active", {
|
|
172
|
+
method: "POST",
|
|
173
|
+
credentials: "include",
|
|
174
|
+
body: {
|
|
175
|
+
orgId: activeOrgId.get()
|
|
176
|
+
}
|
|
177
|
+
});
|
|
178
|
+
return organization.data;
|
|
179
|
+
})
|
|
180
|
+
);
|
|
181
|
+
const $listOrganizations = computed(
|
|
182
|
+
$listOrg,
|
|
183
|
+
() => task(async () => {
|
|
184
|
+
const organizations = await $fetch(
|
|
185
|
+
"/organization/list",
|
|
186
|
+
{
|
|
187
|
+
method: "GET"
|
|
188
|
+
}
|
|
189
|
+
);
|
|
190
|
+
return organizations.data;
|
|
191
|
+
})
|
|
192
|
+
);
|
|
193
|
+
const $activeInvitationId = atom(null);
|
|
194
|
+
const $invitation = computed(
|
|
195
|
+
$activeInvitationId,
|
|
196
|
+
() => task(async () => {
|
|
197
|
+
if (!$activeInvitationId.get()) {
|
|
198
|
+
return {
|
|
199
|
+
error: {
|
|
200
|
+
message: "No invitation found",
|
|
201
|
+
status: 400,
|
|
202
|
+
data: null
|
|
203
|
+
},
|
|
204
|
+
data: null
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
const res = await $fetch("/organization/get-active-invitation", {
|
|
208
|
+
method: "GET",
|
|
209
|
+
query: {
|
|
210
|
+
id: $activeInvitationId.get()
|
|
211
|
+
},
|
|
212
|
+
credentials: "include"
|
|
213
|
+
});
|
|
214
|
+
return res;
|
|
215
|
+
})
|
|
216
|
+
);
|
|
217
|
+
return {
|
|
218
|
+
id: "organization",
|
|
219
|
+
actions: {
|
|
220
|
+
organization: {
|
|
221
|
+
setActive(orgId) {
|
|
222
|
+
activeOrgId.set(orgId);
|
|
223
|
+
},
|
|
224
|
+
setInvitationId: (id) => {
|
|
225
|
+
$activeInvitationId.set(id);
|
|
226
|
+
},
|
|
227
|
+
hasPermission: async (permission) => {
|
|
228
|
+
await $fetch("/organization/has-permission", {
|
|
229
|
+
method: "POST",
|
|
230
|
+
body: {
|
|
231
|
+
permission
|
|
232
|
+
}
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
},
|
|
237
|
+
integrations: {
|
|
238
|
+
react(useStore) {
|
|
239
|
+
return {
|
|
240
|
+
organization: {
|
|
241
|
+
useActiveOrganization() {
|
|
242
|
+
return useStore($activeOrganization);
|
|
243
|
+
},
|
|
244
|
+
useListOrganization() {
|
|
245
|
+
return useStore($listOrganizations);
|
|
246
|
+
},
|
|
247
|
+
useInvitation() {
|
|
248
|
+
return useStore($invitation);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
};
|
|
252
|
+
},
|
|
253
|
+
vue(useStore) {
|
|
254
|
+
return {
|
|
255
|
+
useActiveOrganization() {
|
|
256
|
+
return useStore($activeOrganization);
|
|
257
|
+
},
|
|
258
|
+
useListOrganization() {
|
|
259
|
+
return useStore($listOrganizations);
|
|
260
|
+
},
|
|
261
|
+
useInvitation() {
|
|
262
|
+
return useStore($invitation);
|
|
263
|
+
}
|
|
264
|
+
};
|
|
265
|
+
},
|
|
266
|
+
preact(useStore) {
|
|
267
|
+
return {
|
|
268
|
+
useActiveOrganization() {
|
|
269
|
+
return useStore($activeOrganization);
|
|
270
|
+
},
|
|
271
|
+
useListOrganization() {
|
|
272
|
+
return useStore($listOrganizations);
|
|
273
|
+
},
|
|
274
|
+
useInvitation() {
|
|
275
|
+
return useStore($invitation);
|
|
276
|
+
}
|
|
277
|
+
};
|
|
278
|
+
},
|
|
279
|
+
svelte() {
|
|
280
|
+
return {
|
|
281
|
+
$activeOrganization,
|
|
282
|
+
$listOrganizations,
|
|
283
|
+
$invitation
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
},
|
|
287
|
+
signals: {
|
|
288
|
+
$listOrg,
|
|
289
|
+
$activeOrgSignal
|
|
290
|
+
},
|
|
291
|
+
authProxySignal: [
|
|
292
|
+
{
|
|
293
|
+
matcher(path) {
|
|
294
|
+
return path.startsWith("/organization");
|
|
295
|
+
},
|
|
296
|
+
atom: "$listOrg"
|
|
297
|
+
},
|
|
298
|
+
{
|
|
299
|
+
matcher(path) {
|
|
300
|
+
return path.startsWith("/organization");
|
|
301
|
+
},
|
|
302
|
+
atom: "$activeOrgSignal"
|
|
303
|
+
}
|
|
304
|
+
]
|
|
305
|
+
};
|
|
306
|
+
});
|
|
307
|
+
|
|
308
|
+
// src/plugins/passkey/client.ts
|
|
309
|
+
import {
|
|
310
|
+
WebAuthnError,
|
|
311
|
+
startAuthentication,
|
|
312
|
+
startRegistration
|
|
313
|
+
} from "@simplewebauthn/browser";
|
|
314
|
+
var getPasskeyActions = ($fetch) => {
|
|
315
|
+
const signInPasskey = async (opts) => {
|
|
316
|
+
const response = await $fetch(
|
|
317
|
+
"/passkey/generate-authenticate-options",
|
|
318
|
+
{
|
|
319
|
+
method: "POST",
|
|
320
|
+
body: {
|
|
321
|
+
email: opts?.email
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
);
|
|
325
|
+
if (!response.data) {
|
|
326
|
+
return response;
|
|
327
|
+
}
|
|
328
|
+
try {
|
|
329
|
+
const res = await startAuthentication(
|
|
330
|
+
response.data,
|
|
331
|
+
opts?.autoFill || false
|
|
332
|
+
);
|
|
333
|
+
const verified = await $fetch("/passkey/verify-authentication", {
|
|
334
|
+
body: {
|
|
335
|
+
response: res,
|
|
336
|
+
type: "authenticate"
|
|
337
|
+
}
|
|
338
|
+
});
|
|
339
|
+
if (!verified.data) {
|
|
340
|
+
return verified;
|
|
341
|
+
}
|
|
342
|
+
} catch (e) {
|
|
343
|
+
console.log(e);
|
|
344
|
+
}
|
|
345
|
+
};
|
|
346
|
+
const registerPasskey = async () => {
|
|
347
|
+
const options = await $fetch(
|
|
348
|
+
"/passkey/generate-register-options",
|
|
349
|
+
{
|
|
350
|
+
method: "GET"
|
|
351
|
+
}
|
|
352
|
+
);
|
|
353
|
+
if (!options.data) {
|
|
354
|
+
return options;
|
|
355
|
+
}
|
|
356
|
+
try {
|
|
357
|
+
const res = await startRegistration(options.data);
|
|
358
|
+
const verified = await $fetch("/passkey/verify-registration", {
|
|
359
|
+
body: {
|
|
360
|
+
response: res,
|
|
361
|
+
type: "register"
|
|
362
|
+
}
|
|
363
|
+
});
|
|
364
|
+
if (!verified.data) {
|
|
365
|
+
return verified;
|
|
366
|
+
}
|
|
367
|
+
} catch (e) {
|
|
368
|
+
if (e instanceof WebAuthnError) {
|
|
369
|
+
if (e.code === "ERROR_AUTHENTICATOR_PREVIOUSLY_REGISTERED") {
|
|
370
|
+
return {
|
|
371
|
+
data: null,
|
|
372
|
+
error: {
|
|
373
|
+
message: "previously registered",
|
|
374
|
+
status: 400,
|
|
375
|
+
statusText: "BAD_REQUEST"
|
|
376
|
+
}
|
|
377
|
+
};
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
};
|
|
382
|
+
return {
|
|
383
|
+
signInPasskey,
|
|
384
|
+
registerPasskey
|
|
385
|
+
};
|
|
386
|
+
};
|
|
387
|
+
var passkeyClient = createClientPlugin()(
|
|
388
|
+
($fetch) => {
|
|
389
|
+
return {
|
|
390
|
+
id: "passkey",
|
|
391
|
+
actions: getPasskeyActions($fetch)
|
|
392
|
+
};
|
|
393
|
+
}
|
|
394
|
+
);
|
|
395
|
+
|
|
396
|
+
// src/plugins/username/client.ts
|
|
397
|
+
var usernameClient = createClientPlugin()(
|
|
398
|
+
($fetch) => {
|
|
399
|
+
return {
|
|
400
|
+
id: "username"
|
|
401
|
+
};
|
|
402
|
+
}
|
|
403
|
+
);
|
|
404
|
+
export {
|
|
405
|
+
getPasskeyActions,
|
|
406
|
+
organizationClient,
|
|
407
|
+
passkeyClient,
|
|
408
|
+
twoFactorClient,
|
|
409
|
+
usernameClient
|
|
410
|
+
};
|
|
411
|
+
//# sourceMappingURL=plugins.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/client/create-client-plugin.ts","../../src/plugins/two-factor/client.ts","../../src/plugins/organization/client.ts","../../src/plugins/organization/access/src/access.ts","../../src/plugins/organization/access/statement.ts","../../src/plugins/passkey/client.ts","../../src/plugins/username/client.ts"],"sourcesContent":["import type { BetterFetch, BetterFetchPlugin } from \"@better-fetch/fetch\";\nimport type { Endpoint } from \"better-call\";\nimport type { AuthProxySignal } from \"./proxy\";\nimport type { Atom, PreinitializedWritableAtom } from \"nanostores\";\nimport type { BetterAuthPlugin } from \"../types/plugins\";\nimport type { AuthPlugin } from \"./type\";\nimport type { useAuthStore as reactStore } from \"./react\";\nimport type { useAuthStore as vueStore } from \"./vue\";\nimport type { useAuthStore as preactStore } from \"./preact\";\n\nexport const createClientPlugin = <E extends BetterAuthPlugin = never>() => {\n\treturn <\n\t\tActions extends Record<string, any>,\n\t\tIntegrations extends {\n\t\t\treact?: (useStore: typeof reactStore) => Record<string, any>;\n\t\t\tvue?: (useStore: typeof vueStore) => Record<string, any>;\n\t\t\tpreact?: (useStore: typeof preactStore) => Record<string, any>;\n\t\t\tsvelte?: () => Record<string, any>;\n\t\t},\n\t>(\n\t\t$fn: ($fetch: BetterFetch) => {\n\t\t\tid: string;\n\t\t\tactions?: Actions;\n\t\t\tauthProxySignal?: AuthProxySignal[];\n\t\t\tsignals?: Record<string, PreinitializedWritableAtom<boolean>>;\n\t\t\tatoms?: Record<string, Atom<any>>;\n\t\t\tintegrations?: Integrations;\n\t\t\tpathMethods?: Record<string, \"POST\" | \"GET\">;\n\t\t\tfetchPlugins?: BetterFetchPlugin[];\n\t\t},\n\t) => {\n\t\treturn ($fetch: BetterFetch) => {\n\t\t\tconst data = $fn($fetch);\n\t\t\treturn {\n\t\t\t\t...data,\n\t\t\t\tintegrations: data.integrations as Integrations,\n\t\t\t\tplugin: {} as E,\n\t\t\t};\n\t\t};\n\t};\n};\n\nexport interface AuthClientPlugin {\n\tid: string;\n\tendpoint: Record<string, Endpoint>;\n}\n","import { createClientPlugin } from \"../../client/create-client-plugin\";\nimport type { twoFactor as twoFa } from \"../../plugins/two-factor\";\n\nexport const twoFactorClient = (\n\toptions: {\n\t\ttwoFactorPage: string;\n\t\t/**\n\t\t * Redirect to the two factor page. If twoFactorPage\n\t\t * is not set this will redirect to the root path.\n\t\t * @default true\n\t\t */\n\t\tredirect?: boolean;\n\t} = {\n\t\tredirect: true,\n\t\ttwoFactorPage: \"/\",\n\t},\n) => {\n\treturn createClientPlugin<ReturnType<typeof twoFa>>()(($fetch) => {\n\t\treturn {\n\t\t\tid: \"two-factor\",\n\t\t\tauthProxySignal: [\n\t\t\t\t{\n\t\t\t\t\tmatcher: (path) =>\n\t\t\t\t\t\tpath === \"/two-factor/enable\" || path === \"/two-factor/send-otp\",\n\t\t\t\t\tatom: \"$sessionSignal\",\n\t\t\t\t},\n\t\t\t],\n\t\t\tpathMethods: {\n\t\t\t\t\"enable/totp\": \"POST\",\n\t\t\t\t\"/two-factor/disable\": \"POST\",\n\t\t\t\t\"/two-factor/enable\": \"POST\",\n\t\t\t\t\"/two-factor/send-otp\": \"POST\",\n\t\t\t},\n\t\t\tfetchPlugins: [\n\t\t\t\t{\n\t\t\t\t\tid: \"two-factor\",\n\t\t\t\t\tname: \"two-factor\",\n\t\t\t\t\thooks: {\n\t\t\t\t\t\tasync onSuccess(context) {\n\t\t\t\t\t\t\tif (context.data?.twoFactorRedirect) {\n\t\t\t\t\t\t\t\tif (options.redirect) {\n\t\t\t\t\t\t\t\t\twindow.location.href = options.twoFactorPage;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t};\n\t});\n};\n","import { atom, computed, task } from \"nanostores\";\nimport type {\n\tInvitation,\n\tMember,\n\tOrganization,\n} from \"../../plugins/organization/schema\";\nimport type { Prettify } from \"../../types/helper\";\nimport type { organization as org } from \"../../plugins\";\nimport { createClientPlugin } from \"../../client/create-client-plugin\";\nimport {\n\tcreateAccessControl,\n\tdefaultStatements,\n\ttype AccessControl,\n\ttype Role,\n} from \"./access\";\n\ninterface OrganizationClientOptions {\n\tac: AccessControl;\n\troles?: {\n\t\t[key in \"admin\" | \"member\" | \"owner\"]?: Role<any>;\n\t};\n}\n\nexport const organizationClient = <O extends OrganizationClientOptions>(\n\toptions?: O,\n) =>\n\tcreateClientPlugin<ReturnType<typeof org>>()(($fetch) => {\n\t\tconst activeOrgId = atom<string | null>(null);\n\t\tconst $listOrg = atom<boolean>(false);\n\t\tconst $activeOrgSignal = atom<boolean>(false);\n\t\tconst $activeOrganization = computed([activeOrgId, $activeOrgSignal], () =>\n\t\t\ttask(async () => {\n\t\t\t\tif (!activeOrgId.get()) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t\tconst organization = await $fetch<\n\t\t\t\t\tPrettify<\n\t\t\t\t\t\tOrganization & {\n\t\t\t\t\t\t\tmembers: Member[];\n\t\t\t\t\t\t\tinvitations: Invitation[];\n\t\t\t\t\t\t}\n\t\t\t\t\t>\n\t\t\t\t>(\"/organization/set-active\", {\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\tcredentials: \"include\",\n\t\t\t\t\tbody: {\n\t\t\t\t\t\torgId: activeOrgId.get(),\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\treturn organization.data;\n\t\t\t}),\n\t\t);\n\n\t\tconst $listOrganizations = computed($listOrg, () =>\n\t\t\ttask(async () => {\n\t\t\t\tconst organizations = await $fetch<Organization[]>(\n\t\t\t\t\t\"/organization/list\",\n\t\t\t\t\t{\n\t\t\t\t\t\tmethod: \"GET\",\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\treturn organizations.data;\n\t\t\t}),\n\t\t);\n\n\t\tconst $activeInvitationId = atom<string | null>(null);\n\t\tconst $invitation = computed($activeInvitationId, () =>\n\t\t\ttask(async () => {\n\t\t\t\tif (!$activeInvitationId.get()) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\terror: {\n\t\t\t\t\t\t\tmessage: \"No invitation found\",\n\t\t\t\t\t\t\tstatus: 400,\n\t\t\t\t\t\t\tdata: null,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tdata: null,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tconst res = await $fetch<\n\t\t\t\t\tPrettify<\n\t\t\t\t\t\tInvitation & {\n\t\t\t\t\t\t\torganizationName: string;\n\t\t\t\t\t\t\torganizationSlug: string;\n\t\t\t\t\t\t\tinviterEmail: string;\n\t\t\t\t\t\t\tinviterName: string;\n\t\t\t\t\t\t}\n\t\t\t\t\t>\n\t\t\t\t>(\"/organization/get-active-invitation\", {\n\t\t\t\t\tmethod: \"GET\",\n\t\t\t\t\tquery: {\n\t\t\t\t\t\tid: $activeInvitationId.get(),\n\t\t\t\t\t},\n\t\t\t\t\tcredentials: \"include\",\n\t\t\t\t});\n\t\t\t\treturn res;\n\t\t\t}),\n\t\t);\n\t\ttype DefaultStatements = typeof defaultStatements;\n\t\ttype Statements = O[\"ac\"] extends AccessControl<infer S>\n\t\t\t? S extends Record<string, Array<any>>\n\t\t\t\t? S & DefaultStatements\n\t\t\t\t: DefaultStatements\n\t\t\t: DefaultStatements;\n\t\treturn {\n\t\t\tid: \"organization\",\n\t\t\tactions: {\n\t\t\t\torganization: {\n\t\t\t\t\tsetActive(orgId: string | null) {\n\t\t\t\t\t\tactiveOrgId.set(orgId);\n\t\t\t\t\t},\n\t\t\t\t\tsetInvitationId: (id: string | null) => {\n\t\t\t\t\t\t$activeInvitationId.set(id);\n\t\t\t\t\t},\n\t\t\t\t\thasPermission: async (\n\t\t\t\t\t\tpermission: Partial<{\n\t\t\t\t\t\t\t//@ts-expect-error fix this later\n\t\t\t\t\t\t\t[key in keyof Statements]: Statements[key][number][];\n\t\t\t\t\t\t}>,\n\t\t\t\t\t) => {\n\t\t\t\t\t\tawait $fetch<boolean>(\"/organization/has-permission\", {\n\t\t\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\t\tpermission,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tintegrations: {\n\t\t\t\treact(useStore) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\torganization: {\n\t\t\t\t\t\t\tuseActiveOrganization() {\n\t\t\t\t\t\t\t\treturn useStore($activeOrganization);\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tuseListOrganization() {\n\t\t\t\t\t\t\t\treturn useStore($listOrganizations);\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tuseInvitation() {\n\t\t\t\t\t\t\t\treturn useStore($invitation);\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t\t\tvue(useStore) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tuseActiveOrganization() {\n\t\t\t\t\t\t\treturn useStore($activeOrganization);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tuseListOrganization() {\n\t\t\t\t\t\t\treturn useStore($listOrganizations);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tuseInvitation() {\n\t\t\t\t\t\t\treturn useStore($invitation);\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t\t\tpreact(useStore) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tuseActiveOrganization() {\n\t\t\t\t\t\t\treturn useStore($activeOrganization);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tuseListOrganization() {\n\t\t\t\t\t\t\treturn useStore($listOrganizations);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tuseInvitation() {\n\t\t\t\t\t\t\treturn useStore($invitation);\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t\t\tsvelte() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\t$activeOrganization,\n\t\t\t\t\t\t$listOrganizations,\n\t\t\t\t\t\t$invitation,\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t\t},\n\t\t\tsignals: {\n\t\t\t\t$listOrg,\n\t\t\t\t$activeOrgSignal,\n\t\t\t},\n\t\t\tauthProxySignal: [\n\t\t\t\t{\n\t\t\t\t\tmatcher(path) {\n\t\t\t\t\t\treturn path.startsWith(\"/organization\");\n\t\t\t\t\t},\n\t\t\t\t\tatom: \"$listOrg\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tmatcher(path) {\n\t\t\t\t\t\treturn path.startsWith(\"/organization\");\n\t\t\t\t\t},\n\t\t\t\t\tatom: \"$activeOrgSignal\",\n\t\t\t\t},\n\t\t\t],\n\t\t};\n\t});\n","import type { StatementsPrimitive as Statements, Subset } from \"./types\";\n\nexport class ParsingError extends Error {\n\tpublic readonly path: string;\n\tconstructor(message: string, path: string) {\n\t\tsuper(message);\n\t\tthis.path = path;\n\t}\n}\n\ntype Connector = \"OR\" | \"AND\";\n\nexport class AccessControl<TStatements extends Statements = Statements> {\n\tprivate readonly statements: TStatements;\n\tconstructor(private readonly s: TStatements) {\n\t\tthis.statements = s;\n\t}\n\tpublic newRole<K extends keyof TStatements>(\n\t\tstatements: Subset<K, TStatements>,\n\t) {\n\t\treturn new Role<Subset<K, TStatements>>(statements);\n\t}\n}\n\nexport type AuthortizeResponse =\n\t| { success: false; error: string }\n\t| { success: true; error?: never };\n\nexport class Role<TStatements extends Statements> {\n\tpublic readonly statements: TStatements;\n\n\tconstructor(statements: TStatements) {\n\t\tthis.statements = statements;\n\t}\n\n\tpublic authorize<K extends keyof TStatements>(\n\t\trequest: Subset<K, TStatements>,\n\t\tconnector?: Connector,\n\t): AuthortizeResponse {\n\t\tfor (const [requestedResource, requestedActions] of Object.entries(\n\t\t\trequest,\n\t\t)) {\n\t\t\tconst allowedActions = this.statements[requestedResource];\n\t\t\tif (!allowedActions) {\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\terror: `You are not allowed to access resource: ${requestedResource}`,\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst success =\n\t\t\t\tconnector === \"OR\"\n\t\t\t\t\t? (requestedActions as string[]).some((requestedAction) =>\n\t\t\t\t\t\t\tallowedActions.includes(requestedAction),\n\t\t\t\t\t\t)\n\t\t\t\t\t: (requestedActions as string[]).every((requestedAction) =>\n\t\t\t\t\t\t\tallowedActions.includes(requestedAction),\n\t\t\t\t\t\t);\n\t\t\tif (success) {\n\t\t\t\treturn { success };\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: `unauthorized to access resource \"${requestedResource}\"`,\n\t\t\t};\n\t\t}\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\terror: \"Not authorized\",\n\t\t};\n\t}\n\n\tstatic fromString<TStatements extends Statements>(s: string) {\n\t\tconst statements = JSON.parse(s) as TStatements;\n\n\t\tif (typeof statements !== \"object\") {\n\t\t\tthrow new ParsingError(\"statements is not an object\", \".\");\n\t\t}\n\t\tfor (const [resource, actions] of Object.entries(statements)) {\n\t\t\tif (typeof resource !== \"string\") {\n\t\t\t\tthrow new ParsingError(\"invalid resource identifier\", resource);\n\t\t\t}\n\t\t\tif (!Array.isArray(actions)) {\n\t\t\t\tthrow new ParsingError(\"actions is not an array\", resource);\n\t\t\t}\n\t\t\tfor (let i = 0; i < actions.length; i++) {\n\t\t\t\tif (typeof actions[i] !== \"string\") {\n\t\t\t\t\tthrow new ParsingError(\"action is not a string\", `${resource}[${i}]`);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn new Role<TStatements>(statements);\n\t}\n\n\tpublic toString(): string {\n\t\treturn JSON.stringify(this.statements);\n\t}\n}\n","import { AccessControl } from \"./src/access\";\nimport type { StatementsPrimitive } from \"./src/types\";\n\nexport const createAccessControl = <S extends StatementsPrimitive>(\n\tstatements: S,\n) => {\n\treturn new AccessControl<S>(statements);\n};\n\nexport const defaultStatements = {\n\torganization: [\"update\", \"delete\"],\n\tmember: [\"create\", \"update\", \"delete\"],\n\tinvitation: [\"create\", \"cancel\"],\n} as const;\n\nexport const defaultAc = createAccessControl(defaultStatements);\n\nexport const adminAc = defaultAc.newRole({\n\torganization: [\"update\"],\n\tinvitation: [\"create\", \"cancel\"],\n\tmember: [\"create\", \"update\", \"delete\"],\n});\n\nexport const ownerAc = defaultAc.newRole({\n\torganization: [\"update\", \"delete\"],\n\tmember: [\"create\", \"update\", \"delete\"],\n\tinvitation: [\"create\", \"cancel\"],\n});\n\nexport const memberAc = defaultAc.newRole({\n\torganization: [],\n\tmember: [],\n\tinvitation: [],\n});\n\nexport const defaultRoles = {\n\tadmin: adminAc,\n\towner: ownerAc,\n\tmember: memberAc,\n};\n","import type { BetterFetch } from \"@better-fetch/fetch\";\nimport {\n\tWebAuthnError,\n\tstartAuthentication,\n\tstartRegistration,\n} from \"@simplewebauthn/browser\";\nimport type {\n\tPublicKeyCredentialCreationOptionsJSON,\n\tPublicKeyCredentialRequestOptionsJSON,\n} from \"@simplewebauthn/types\";\nimport type { Session } from \"inspector\";\nimport type { User } from \"../../adapters/schema\";\nimport type { passkey as passkeyPl, Passkey } from \"../../plugins\";\nimport { createClientPlugin } from \"../../client/create-client-plugin\";\n\nexport const getPasskeyActions = ($fetch: BetterFetch) => {\n\tconst signInPasskey = async (opts?: {\n\t\tautoFill?: boolean;\n\t\temail?: string;\n\t\tcallbackURL?: string;\n\t}) => {\n\t\tconst response = await $fetch<PublicKeyCredentialRequestOptionsJSON>(\n\t\t\t\"/passkey/generate-authenticate-options\",\n\t\t\t{\n\t\t\t\tmethod: \"POST\",\n\t\t\t\tbody: {\n\t\t\t\t\temail: opts?.email,\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\t\tif (!response.data) {\n\t\t\treturn response;\n\t\t}\n\t\ttry {\n\t\t\tconst res = await startAuthentication(\n\t\t\t\tresponse.data,\n\t\t\t\topts?.autoFill || false,\n\t\t\t);\n\t\t\tconst verified = await $fetch<{\n\t\t\t\tsession: Session;\n\t\t\t\tuser: User;\n\t\t\t}>(\"/passkey/verify-authentication\", {\n\t\t\t\tbody: {\n\t\t\t\t\tresponse: res,\n\t\t\t\t\ttype: \"authenticate\",\n\t\t\t\t},\n\t\t\t});\n\t\t\tif (!verified.data) {\n\t\t\t\treturn verified;\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.log(e);\n\t\t}\n\t};\n\n\tconst registerPasskey = async () => {\n\t\tconst options = await $fetch<PublicKeyCredentialCreationOptionsJSON>(\n\t\t\t\"/passkey/generate-register-options\",\n\t\t\t{\n\t\t\t\tmethod: \"GET\",\n\t\t\t},\n\t\t);\n\t\tif (!options.data) {\n\t\t\treturn options;\n\t\t}\n\t\ttry {\n\t\t\tconst res = await startRegistration(options.data);\n\t\t\tconst verified = await $fetch<{\n\t\t\t\tpasskey: Passkey;\n\t\t\t}>(\"/passkey/verify-registration\", {\n\t\t\t\tbody: {\n\t\t\t\t\tresponse: res,\n\t\t\t\t\ttype: \"register\",\n\t\t\t\t},\n\t\t\t});\n\t\t\tif (!verified.data) {\n\t\t\t\treturn verified;\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tif (e instanceof WebAuthnError) {\n\t\t\t\tif (e.code === \"ERROR_AUTHENTICATOR_PREVIOUSLY_REGISTERED\") {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tdata: null,\n\t\t\t\t\t\terror: {\n\t\t\t\t\t\t\tmessage: \"previously registered\",\n\t\t\t\t\t\t\tstatus: 400,\n\t\t\t\t\t\t\tstatusText: \"BAD_REQUEST\",\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\treturn {\n\t\tsignInPasskey,\n\t\tregisterPasskey,\n\t};\n};\n\nexport const passkeyClient = createClientPlugin<ReturnType<typeof passkeyPl>>()(\n\t($fetch) => {\n\t\treturn {\n\t\t\tid: \"passkey\",\n\t\t\tactions: getPasskeyActions($fetch),\n\t\t};\n\t},\n);\n","import type { username } from \".\";\nimport { createClientPlugin } from \"../../client/create-client-plugin\";\n\nexport const usernameClient = createClientPlugin<ReturnType<typeof username>>()(\n\t($fetch) => {\n\t\treturn {\n\t\t\tid: \"username\",\n\t\t};\n\t},\n);\n"],"mappings":"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","names":[]}
|