@rttnd/gau 1.4.3 → 1.4.4
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/chunk-6HKZAQHT.js +1 -0
- package/dist/chunk-6HKZAQHT.js.map +1 -0
- package/dist/chunk-MXZ363UZ.js +1 -0
- package/dist/chunk-MXZ363UZ.js.map +1 -0
- package/dist/chunk-NHENQLYI.js +1 -0
- package/dist/chunk-NHENQLYI.js.map +1 -0
- package/dist/chunk-V6AIGB33.js +1 -0
- package/dist/chunk-V6AIGB33.js.map +1 -0
- package/dist/chunk-VXWI4D7H.js +1 -0
- package/dist/chunk-VXWI4D7H.js.map +1 -0
- package/dist/src/adapters/drizzle/index.d.ts +1 -1
- package/dist/src/adapters/drizzle/index.js +1 -1
- package/dist/src/adapters/drizzle/pg.d.ts +3 -26
- package/dist/src/adapters/drizzle/pg.d.ts.map +1 -1
- package/dist/src/adapters/drizzle/shared.d.ts +49 -0
- package/dist/src/adapters/drizzle/shared.d.ts.map +1 -0
- package/dist/src/adapters/drizzle/sqlite.d.ts +3 -26
- package/dist/src/adapters/drizzle/sqlite.d.ts.map +1 -1
- package/dist/src/adapters/index.js +1 -1
- package/dist/src/client/shared/clientAuth.d.ts +57 -0
- package/dist/src/client/shared/clientAuth.d.ts.map +1 -0
- package/dist/src/client/solid/index.d.ts +3 -14
- package/dist/src/client/solid/index.d.ts.map +1 -1
- package/dist/src/client/solid/index.jsx +160 -216
- package/dist/src/client/solid2/Protected.d.ts +5 -0
- package/dist/src/client/solid2/Protected.d.ts.map +1 -0
- package/dist/src/client/solid2/index.d.ts +36 -0
- package/dist/src/client/solid2/index.d.ts.map +1 -0
- package/dist/src/client/solid2/index.jsx +708 -0
- package/dist/src/client/svelte/index.svelte.d.ts +3 -14
- package/dist/src/client/svelte/index.svelte.d.ts.map +1 -1
- package/dist/src/client/svelte/index.svelte.js +1 -1
- package/dist/src/client/svelte/index.svelte.js.map +1 -1
- package/dist/src/client/vanilla/index.js +1 -1
- package/dist/src/client/vanilla/index.js.map +1 -1
- package/dist/src/core/handlers/callback.d.ts.map +1 -1
- package/dist/src/core/handlers/index.js +1 -1
- package/dist/src/core/index.js +1 -1
- package/dist/src/core/serverSession.d.ts +13 -0
- package/dist/src/core/serverSession.d.ts.map +1 -0
- package/dist/src/index.js +1 -1
- package/dist/src/jwt/index.js +1 -1
- package/dist/src/oauth/index.d.ts +13 -11
- package/dist/src/oauth/index.d.ts.map +1 -1
- package/dist/src/oauth/index.js +1 -1
- package/dist/src/oauth/index.js.map +1 -1
- package/dist/src/oauth/providers/discord.d.ts.map +1 -1
- package/dist/src/oauth/providers/facebook.d.ts.map +1 -1
- package/dist/src/oauth/providers/github.d.ts.map +1 -1
- package/dist/src/oauth/providers/google.d.ts.map +1 -1
- package/dist/src/oauth/providers/microsoft.d.ts.map +1 -1
- package/dist/src/oauth/utils.d.ts +26 -0
- package/dist/src/oauth/utils.d.ts.map +1 -1
- package/dist/src/runtimes/index.js +1 -1
- package/dist/src/runtimes/tauri/index.d.ts.map +1 -1
- package/dist/src/runtimes/tauri/index.js +1 -1
- package/dist/src/solidstart/index.d.ts +4 -4
- package/dist/src/solidstart/index.d.ts.map +1 -1
- package/dist/src/solidstart/index.js +1 -1
- package/dist/src/solidstart/index.js.map +1 -1
- package/dist/src/sveltekit/index.d.ts +2 -2
- package/dist/src/sveltekit/index.d.ts.map +1 -1
- package/dist/src/sveltekit/index.js +1 -1
- package/dist/src/sveltekit/index.js.map +1 -1
- package/package.json +14 -4
- package/dist/chunk-DVVL3GFT.js +0 -1
- package/dist/chunk-DVVL3GFT.js.map +0 -1
- package/dist/chunk-MRKRGLUT.js +0 -1
- package/dist/chunk-MRKRGLUT.js.map +0 -1
- package/dist/chunk-PL7MV7OC.js +0 -1
- package/dist/chunk-PL7MV7OC.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pg.d.ts","sourceRoot":"","sources":["../../../../src/adapters/drizzle/pg.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pg.d.ts","sourceRoot":"","sources":["../../../../src/adapters/drizzle/pg.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAW,MAAM,qBAAqB,CAAA;AAC9D,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAIzD,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAEzD,wBAAgB,sBAAsB,CACpC,EAAE,SAAS,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EACpC,CAAC,SAAS,UAAU,EACpB,CAAC,SAAS,aAAa,EACvB,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,2BAoI9B"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { AnyColumn, InferInsertModel, InferSelectModel, Table } from 'drizzle-orm';
|
|
2
|
+
import type { Account, Adapter } from '../../core';
|
|
3
|
+
export type UsersTable = Table & {
|
|
4
|
+
id: AnyColumn;
|
|
5
|
+
name: AnyColumn;
|
|
6
|
+
email: AnyColumn;
|
|
7
|
+
image: AnyColumn;
|
|
8
|
+
emailVerified: AnyColumn;
|
|
9
|
+
role?: AnyColumn;
|
|
10
|
+
createdAt: AnyColumn;
|
|
11
|
+
updatedAt: AnyColumn;
|
|
12
|
+
};
|
|
13
|
+
export type AccountsTable = Table & {
|
|
14
|
+
userId: AnyColumn;
|
|
15
|
+
type: AnyColumn;
|
|
16
|
+
provider: AnyColumn;
|
|
17
|
+
providerAccountId: AnyColumn;
|
|
18
|
+
refreshToken: AnyColumn;
|
|
19
|
+
accessToken: AnyColumn;
|
|
20
|
+
expiresAt: AnyColumn;
|
|
21
|
+
tokenType: AnyColumn;
|
|
22
|
+
scope: AnyColumn;
|
|
23
|
+
idToken: AnyColumn;
|
|
24
|
+
sessionState?: AnyColumn;
|
|
25
|
+
};
|
|
26
|
+
type UpdateAccountData = Partial<Account> & {
|
|
27
|
+
userId: string;
|
|
28
|
+
provider: string;
|
|
29
|
+
providerAccountId: string;
|
|
30
|
+
};
|
|
31
|
+
interface AdapterHooks<U extends UsersTable, A extends AccountsTable> {
|
|
32
|
+
getUser: (id: string) => Promise<InferSelectModel<U> | undefined>;
|
|
33
|
+
getUserByEmail: (email: string) => Promise<InferSelectModel<U> | undefined>;
|
|
34
|
+
getUserByAccount: (provider: string, providerAccountId: string) => Promise<InferSelectModel<U> | undefined>;
|
|
35
|
+
getAccounts: (userId: string) => Promise<InferSelectModel<A>[]>;
|
|
36
|
+
getUserAndAccounts: (userId: string) => Promise<{
|
|
37
|
+
user: InferSelectModel<U> | null | undefined;
|
|
38
|
+
accounts: InferSelectModel<A>[];
|
|
39
|
+
} | null>;
|
|
40
|
+
createUser: (id: string, data: InferInsertModel<U>) => Promise<InferSelectModel<U> | undefined>;
|
|
41
|
+
linkAccount: (data: InferInsertModel<A>) => Promise<void>;
|
|
42
|
+
unlinkAccount: (provider: string, providerAccountId: string) => Promise<void>;
|
|
43
|
+
updateAccount: (data: UpdateAccountData) => Promise<void>;
|
|
44
|
+
updateUser: (id: string, data: Partial<InferInsertModel<U>>) => Promise<InferSelectModel<U> | undefined>;
|
|
45
|
+
deleteUser: (id: string) => Promise<void>;
|
|
46
|
+
}
|
|
47
|
+
export declare function createDrizzleAdapter<U extends UsersTable, A extends AccountsTable>(Users: U, hooks: AdapterHooks<U, A>): Adapter;
|
|
48
|
+
export {};
|
|
49
|
+
//# sourceMappingURL=shared.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../../src/adapters/drizzle/shared.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,28 +1,5 @@
|
|
|
1
|
-
import type { AnyColumn, Table } from 'drizzle-orm';
|
|
2
1
|
import type { BaseSQLiteDatabase } from 'drizzle-orm/sqlite-core';
|
|
3
|
-
import type {
|
|
4
|
-
export type UsersTable
|
|
5
|
-
|
|
6
|
-
name: AnyColumn;
|
|
7
|
-
email: AnyColumn;
|
|
8
|
-
image: AnyColumn;
|
|
9
|
-
emailVerified: AnyColumn;
|
|
10
|
-
role?: AnyColumn;
|
|
11
|
-
createdAt: AnyColumn;
|
|
12
|
-
updatedAt: AnyColumn;
|
|
13
|
-
};
|
|
14
|
-
export type AccountsTable = Table & {
|
|
15
|
-
userId: AnyColumn;
|
|
16
|
-
type: AnyColumn;
|
|
17
|
-
provider: AnyColumn;
|
|
18
|
-
providerAccountId: AnyColumn;
|
|
19
|
-
refreshToken: AnyColumn;
|
|
20
|
-
accessToken: AnyColumn;
|
|
21
|
-
expiresAt: AnyColumn;
|
|
22
|
-
tokenType: AnyColumn;
|
|
23
|
-
scope: AnyColumn;
|
|
24
|
-
idToken: AnyColumn;
|
|
25
|
-
sessionState?: AnyColumn;
|
|
26
|
-
};
|
|
27
|
-
export declare function SQLiteDrizzleAdapter<DB extends BaseSQLiteDatabase<'sync' | 'async', any, any>, U extends UsersTable, A extends AccountsTable>(db: DB, Users: U, Accounts: A): Adapter;
|
|
2
|
+
import type { AccountsTable, UsersTable } from './shared';
|
|
3
|
+
export type { AccountsTable, UsersTable } from './shared';
|
|
4
|
+
export declare function SQLiteDrizzleAdapter<DB extends BaseSQLiteDatabase<'sync' | 'async', any, any>, U extends UsersTable, A extends AccountsTable>(db: DB, Users: U, Accounts: A): import("../..").Adapter;
|
|
28
5
|
//# sourceMappingURL=sqlite.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqlite.d.ts","sourceRoot":"","sources":["../../../../src/adapters/drizzle/sqlite.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"sqlite.d.ts","sourceRoot":"","sources":["../../../../src/adapters/drizzle/sqlite.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AACjE,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAKzD,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAEzD,wBAAgB,oBAAoB,CAClC,EAAE,SAAS,kBAAkB,CAAC,MAAM,GAAG,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,EACzD,CAAC,SAAS,UAAU,EACpB,CAAC,SAAS,aAAa,EACvB,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,2BAuH9B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{MemoryAdapter as o}from"../../chunk-VQD3ROBK.js";import{DrizzleAdapter as r}from"../../chunk-
|
|
1
|
+
import{MemoryAdapter as o}from"../../chunk-VQD3ROBK.js";import{DrizzleAdapter as r}from"../../chunk-V6AIGB33.js";export{r as DrizzleAdapter,o as MemoryAdapter};//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import type { GauSession, ProfileName, ProviderIds } from '../../core';
|
|
2
|
+
type Session<TAuth = unknown> = GauSession<ProviderIds<TAuth>>;
|
|
3
|
+
export interface ClientAuthControls<TAuth = unknown> {
|
|
4
|
+
signIn: <P extends ProviderIds<TAuth>>(provider: P, options?: {
|
|
5
|
+
redirectTo?: string;
|
|
6
|
+
profile?: ProfileName<TAuth, P>;
|
|
7
|
+
}) => Promise<void>;
|
|
8
|
+
linkAccount: <P extends ProviderIds<TAuth>>(provider: P, options?: {
|
|
9
|
+
redirectTo?: string;
|
|
10
|
+
profile?: ProfileName<TAuth, P>;
|
|
11
|
+
}) => Promise<void>;
|
|
12
|
+
unlinkAccount: (provider: ProviderIds<TAuth>) => Promise<void>;
|
|
13
|
+
signOut: () => Promise<void>;
|
|
14
|
+
refresh: () => Promise<void>;
|
|
15
|
+
fetch: (input: RequestInfo | URL, init?: RequestInit) => Promise<Response>;
|
|
16
|
+
}
|
|
17
|
+
interface ClientAuthClient<TAuth = unknown> {
|
|
18
|
+
fetch: (input: RequestInfo | URL, init?: RequestInit) => Promise<Response>;
|
|
19
|
+
refreshSession: () => Promise<Session<TAuth>>;
|
|
20
|
+
handleRedirectCallback: (replaceUrl?: (url: string) => void | Promise<void>) => Promise<boolean>;
|
|
21
|
+
onSessionChange: (listener: (session: Session<TAuth>) => void) => () => void;
|
|
22
|
+
startTauriBridge: () => Promise<(() => void) | void>;
|
|
23
|
+
signIn: <P extends ProviderIds<TAuth>, PR extends (ProfileName<TAuth, P> | string) | undefined>(provider: P, options?: {
|
|
24
|
+
redirectTo?: string;
|
|
25
|
+
profile?: PR;
|
|
26
|
+
}) => Promise<string>;
|
|
27
|
+
linkAccount: <P extends ProviderIds<TAuth>, PR extends (ProfileName<TAuth, P> | string) | undefined>(provider: P, options?: {
|
|
28
|
+
redirectTo?: string;
|
|
29
|
+
profile?: PR;
|
|
30
|
+
}) => Promise<string>;
|
|
31
|
+
unlinkAccount: (provider: ProviderIds<TAuth>) => Promise<boolean>;
|
|
32
|
+
signOut: () => Promise<void>;
|
|
33
|
+
}
|
|
34
|
+
interface BrowserAuthEnvironment {
|
|
35
|
+
isBrowser: () => boolean;
|
|
36
|
+
isTauri: () => boolean;
|
|
37
|
+
origin: () => string;
|
|
38
|
+
href: () => string;
|
|
39
|
+
navigate: (url: string) => void;
|
|
40
|
+
}
|
|
41
|
+
interface ClientAuthOptions<TAuth = unknown> {
|
|
42
|
+
client: ClientAuthClient<TAuth>;
|
|
43
|
+
redirectTo?: string;
|
|
44
|
+
setSession: (session: Session<TAuth>) => void;
|
|
45
|
+
onReady?: () => void;
|
|
46
|
+
onRefreshing?: (refreshing: boolean) => void;
|
|
47
|
+
replaceUrl?: (url: string) => void | Promise<void>;
|
|
48
|
+
logger?: Pick<Console, 'error'>;
|
|
49
|
+
env?: Partial<BrowserAuthEnvironment>;
|
|
50
|
+
}
|
|
51
|
+
export declare function createEmptyClientSession<TProviders extends string = string>(): GauSession<TProviders>;
|
|
52
|
+
export declare function createClientAuth<const TAuth = unknown>({ client, redirectTo: defaultRedirectTo, setSession, onReady, onRefreshing, replaceUrl, logger, env }: ClientAuthOptions<TAuth>): {
|
|
53
|
+
mount: () => () => void;
|
|
54
|
+
controls: ClientAuthControls<TAuth>;
|
|
55
|
+
};
|
|
56
|
+
export {};
|
|
57
|
+
//# sourceMappingURL=clientAuth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clientAuth.d.ts","sourceRoot":"","sources":["../../../../src/client/shared/clientAuth.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,20 +1,9 @@
|
|
|
1
1
|
import type { Accessor, ParentProps, Resource } from 'solid-js';
|
|
2
|
-
import type { GauSession,
|
|
3
|
-
|
|
2
|
+
import type { GauSession, ProviderIds } from '../../core';
|
|
3
|
+
import type { ClientAuthControls } from '../shared/clientAuth';
|
|
4
|
+
interface AuthContextValue<TAuth = unknown> extends ClientAuthControls<TAuth> {
|
|
4
5
|
session: Accessor<GauSession<ProviderIds<TAuth>>>;
|
|
5
6
|
isLoading: Accessor<boolean>;
|
|
6
|
-
signIn: <P extends ProviderIds<TAuth>>(provider: P, options?: {
|
|
7
|
-
redirectTo?: string;
|
|
8
|
-
profile?: ProfileName<TAuth, P>;
|
|
9
|
-
}) => Promise<void>;
|
|
10
|
-
linkAccount: <P extends ProviderIds<TAuth>>(provider: P, options?: {
|
|
11
|
-
redirectTo?: string;
|
|
12
|
-
profile?: ProfileName<TAuth, P>;
|
|
13
|
-
}) => Promise<void>;
|
|
14
|
-
unlinkAccount: (provider: ProviderIds<TAuth>) => Promise<void>;
|
|
15
|
-
signOut: () => Promise<void>;
|
|
16
|
-
refresh: () => Promise<void>;
|
|
17
|
-
fetch: (input: RequestInfo | URL, init?: RequestInit) => Promise<Response>;
|
|
18
7
|
}
|
|
19
8
|
interface AuthProviderProps<TAuth = unknown> extends ParentProps {
|
|
20
9
|
auth?: TAuth;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/client/solid/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAC/D,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/client/solid/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAC/D,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AACzD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAQ9D,UAAU,gBAAgB,CAAC,KAAK,GAAG,OAAO,CAAE,SAAQ,kBAAkB,CAAC,KAAK,CAAC;IAC3E,OAAO,EAAE,QAAQ,CAAC,UAAU,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IACjD,SAAS,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAA;CAC7B;AAID,UAAU,iBAAiB,CAAC,KAAK,GAAG,OAAO,CAAE,SAAQ,WAAW;IAC9D,IAAI,CAAC,EAAE,KAAK,CAAA;IACZ,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB;;;;;;;;;OASG;IACH,OAAO,CAAC,EAAE,QAAQ,CAAC,UAAU,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,GAAG,SAAS,CAAC,GAAG,QAAQ,CAAC,UAAU,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;CAC1G;AAED,wBAAgB,YAAY,CAAC,KAAK,CAAC,KAAK,GAAG,OAAO,EAAE,KAAK,EAAE,iBAAiB,CAAC,KAAK,CAAC,kCA+ElF;AAED,wBAAgB,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,OAAO,KAAK,gBAAgB,CAAC,KAAK,CAAC,CAKxE;AAED,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA"}
|
|
@@ -8,13 +8,6 @@ var __export = (target, all) => {
|
|
|
8
8
|
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
9
|
};
|
|
10
10
|
|
|
11
|
-
// src/core/templates.ts
|
|
12
|
-
var init_templates = __esm({
|
|
13
|
-
"src/core/templates.ts"() {
|
|
14
|
-
"use strict";
|
|
15
|
-
}
|
|
16
|
-
});
|
|
17
|
-
|
|
18
11
|
// src/client/token.ts
|
|
19
12
|
import { BROWSER } from "esm-env";
|
|
20
13
|
function storeSessionToken(token) {
|
|
@@ -102,31 +95,28 @@ function resolveOrigin(baseUrl) {
|
|
|
102
95
|
return null;
|
|
103
96
|
}
|
|
104
97
|
}
|
|
98
|
+
function resolveAbsoluteBase(baseUrl) {
|
|
99
|
+
try {
|
|
100
|
+
return new URL(baseUrl).toString().replace(/\/$/, "");
|
|
101
|
+
} catch {
|
|
102
|
+
if (BROWSER2 && typeof window !== "undefined") {
|
|
103
|
+
try {
|
|
104
|
+
return new URL(baseUrl, window.location.origin).toString().replace(/\/$/, "");
|
|
105
|
+
} catch {
|
|
106
|
+
return baseUrl;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return baseUrl;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
function resolveTauriRedirect(redirectOverride, scheme) {
|
|
113
|
+
return redirectOverride ?? `${scheme}://oauth/callback`;
|
|
114
|
+
}
|
|
105
115
|
async function signInWithTauri(provider, baseUrl, scheme = "gau", redirectOverride, profile) {
|
|
106
116
|
if (!isTauri())
|
|
107
117
|
return;
|
|
108
118
|
const { openUrl } = await import("@tauri-apps/plugin-opener");
|
|
109
|
-
|
|
110
|
-
try {
|
|
111
|
-
const u = new URL(base);
|
|
112
|
-
return u.toString().replace(/\/$/, "");
|
|
113
|
-
} catch {
|
|
114
|
-
if (BROWSER2 && typeof window !== "undefined") {
|
|
115
|
-
try {
|
|
116
|
-
const u = new URL(base, window.location.origin);
|
|
117
|
-
return u.toString().replace(/\/$/, "");
|
|
118
|
-
} catch {
|
|
119
|
-
return base;
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
return base;
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
let redirectTo;
|
|
126
|
-
if (redirectOverride)
|
|
127
|
-
redirectTo = redirectOverride;
|
|
128
|
-
else
|
|
129
|
-
redirectTo = `${scheme}://oauth/callback`;
|
|
119
|
+
const redirectTo = resolveTauriRedirect(redirectOverride, scheme);
|
|
130
120
|
const { codeVerifier, codeChallenge } = await generatePKCE();
|
|
131
121
|
localStorage.setItem("gau-pkce-verifier", codeVerifier);
|
|
132
122
|
const params = new URLSearchParams();
|
|
@@ -134,8 +124,7 @@ async function signInWithTauri(provider, baseUrl, scheme = "gau", redirectOverri
|
|
|
134
124
|
if (profile)
|
|
135
125
|
params.set("profile", String(profile));
|
|
136
126
|
params.set("code_challenge", codeChallenge);
|
|
137
|
-
const
|
|
138
|
-
const authUrl = `${resolvedBase}/${provider}?${params.toString()}`;
|
|
127
|
+
const authUrl = `${resolveAbsoluteBase(baseUrl)}/${provider}?${params.toString()}`;
|
|
139
128
|
await openUrl(authUrl);
|
|
140
129
|
}
|
|
141
130
|
async function setupTauriListener(handler) {
|
|
@@ -187,11 +176,7 @@ async function linkAccountWithTauri(provider, baseUrl, scheme = "gau", redirectO
|
|
|
187
176
|
if (!isTauri())
|
|
188
177
|
return;
|
|
189
178
|
const { openUrl } = await import("@tauri-apps/plugin-opener");
|
|
190
|
-
|
|
191
|
-
if (redirectOverride)
|
|
192
|
-
redirectTo = redirectOverride;
|
|
193
|
-
else
|
|
194
|
-
redirectTo = `${scheme}://oauth/callback`;
|
|
179
|
+
const redirectTo = resolveTauriRedirect(redirectOverride, scheme);
|
|
195
180
|
const token = getSessionToken();
|
|
196
181
|
if (!token) {
|
|
197
182
|
console.error("No session token found, cannot link account.");
|
|
@@ -202,23 +187,7 @@ async function linkAccountWithTauri(provider, baseUrl, scheme = "gau", redirectO
|
|
|
202
187
|
params.set("token", token);
|
|
203
188
|
if (profile)
|
|
204
189
|
params.set("profile", String(profile));
|
|
205
|
-
const
|
|
206
|
-
try {
|
|
207
|
-
const u = new URL(baseUrl);
|
|
208
|
-
return u.toString().replace(/\/$/, "");
|
|
209
|
-
} catch {
|
|
210
|
-
if (BROWSER2 && typeof window !== "undefined") {
|
|
211
|
-
try {
|
|
212
|
-
const u = new URL(baseUrl, window.location.origin);
|
|
213
|
-
return u.toString().replace(/\/$/, "");
|
|
214
|
-
} catch {
|
|
215
|
-
return baseUrl;
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
return baseUrl;
|
|
219
|
-
}
|
|
220
|
-
})();
|
|
221
|
-
const linkUrl = `${resolvedBase}/link/${provider}?${params.toString()}`;
|
|
190
|
+
const linkUrl = `${resolveAbsoluteBase(baseUrl)}/link/${provider}?${params.toString()}`;
|
|
222
191
|
await openUrl(linkUrl);
|
|
223
192
|
}
|
|
224
193
|
async function startAuthBridge(baseUrl, scheme, onToken) {
|
|
@@ -237,88 +206,124 @@ var init_tauri = __esm({
|
|
|
237
206
|
});
|
|
238
207
|
|
|
239
208
|
// src/client/solid/index.tsx
|
|
240
|
-
|
|
209
|
+
init_tauri();
|
|
210
|
+
import { createContext, createMemo, createSignal, onCleanup, onMount as onMount2, untrack, useContext } from "solid-js";
|
|
241
211
|
import { isServer as isServer2 } from "solid-js/web";
|
|
242
212
|
|
|
243
|
-
// src/
|
|
244
|
-
|
|
245
|
-
var
|
|
246
|
-
|
|
247
|
-
// src/core/createAuth.ts
|
|
248
|
-
import { parse as parse2, serialize as serialize2 } from "cookie";
|
|
249
|
-
|
|
250
|
-
// src/jwt/jwt.ts
|
|
251
|
-
import {
|
|
252
|
-
createJWTSignatureMessage,
|
|
253
|
-
encodeJWT,
|
|
254
|
-
JWSRegisteredHeaders,
|
|
255
|
-
JWTRegisteredClaims,
|
|
256
|
-
parseJWT
|
|
257
|
-
} from "@oslojs/jwt";
|
|
258
|
-
|
|
259
|
-
// src/core/errors.ts
|
|
260
|
-
var ErrorMessages = {
|
|
261
|
-
// OAuth Flow Errors
|
|
262
|
-
CSRF_INVALID: "Invalid CSRF token",
|
|
263
|
-
PKCE_MISSING: "Missing PKCE code verifier",
|
|
264
|
-
PKCE_CHALLENGE_MISSING: "Missing PKCE challenge",
|
|
265
|
-
OAUTH_CANCELLED: "Authentication was cancelled",
|
|
266
|
-
PROVIDER_NOT_FOUND: "Provider not found",
|
|
267
|
-
AUTHORIZATION_URL_FAILED: "Could not create authorization URL",
|
|
268
|
-
// User Errors
|
|
269
|
-
USER_NOT_FOUND: "User not found",
|
|
270
|
-
USER_CREATE_FAILED: "Failed to create user",
|
|
271
|
-
ACCOUNT_ALREADY_LINKED: "Account already linked to another user",
|
|
272
|
-
ACCOUNT_LINK_FAILED: "Failed to link account",
|
|
273
|
-
ACCOUNT_NOT_LINKED: "Account not linked",
|
|
274
|
-
CANNOT_UNLINK_LAST_ACCOUNT: "Cannot unlink the last account",
|
|
275
|
-
EMAIL_ALREADY_EXISTS: "An account with this email already exists",
|
|
276
|
-
EMAIL_MISMATCH: "Email mismatch between existing account and provider",
|
|
277
|
-
LINKING_NOT_ALLOWED: "Linking not allowed",
|
|
278
|
-
LINK_ONLY_PROVIDER: "Sign-in with this provider is disabled. Please link it to an existing account.",
|
|
279
|
-
// Session Errors
|
|
280
|
-
UNAUTHORIZED: "Unauthorized",
|
|
281
|
-
FORBIDDEN: "Forbidden",
|
|
282
|
-
SESSION_INVALID: "Invalid session",
|
|
283
|
-
SESSION_VALIDATION_FAILED: "Failed to validate session",
|
|
284
|
-
// Token Errors
|
|
285
|
-
TOKEN_INVALID: "Invalid token",
|
|
286
|
-
TOKEN_EXPIRED: "Token expired",
|
|
287
|
-
CODE_VERIFIER_INVALID: "Invalid code verifier",
|
|
288
|
-
// Request Errors
|
|
289
|
-
NOT_FOUND: "Not found",
|
|
290
|
-
METHOD_NOT_ALLOWED: "Method not allowed",
|
|
291
|
-
INVALID_REQUEST: "Invalid request",
|
|
292
|
-
INVALID_REDIRECT_URL: "Invalid redirect URL",
|
|
293
|
-
UNTRUSTED_HOST: "Untrusted redirect host",
|
|
294
|
-
UNKNOWN_PROFILE: "Unknown profile",
|
|
295
|
-
// Internal Errors
|
|
296
|
-
INTERNAL_ERROR: "An unexpected error occurred",
|
|
297
|
-
// Impersonation Errors
|
|
298
|
-
IMPERSONATION_DISABLED: "Impersonation is not enabled",
|
|
299
|
-
IMPERSONATION_NOT_ALLOWED: "You are not allowed to impersonate users",
|
|
300
|
-
IMPERSONATION_TARGET_PROTECTED: "Cannot impersonate users with protected roles"
|
|
301
|
-
};
|
|
302
|
-
var ErrorCodes = Object.fromEntries(
|
|
303
|
-
Object.keys(ErrorMessages).map((k) => [k, k])
|
|
304
|
-
);
|
|
305
|
-
|
|
306
|
-
// src/core/handlers/callback.ts
|
|
307
|
-
init_templates();
|
|
308
|
-
|
|
309
|
-
// src/oauth/utils.ts
|
|
310
|
-
import { generateCodeVerifier, generateState } from "arctic";
|
|
311
|
-
|
|
312
|
-
// src/core/index.ts
|
|
313
|
-
init_templates();
|
|
314
|
-
var NULL_SESSION = {
|
|
213
|
+
// src/client/shared/clientAuth.ts
|
|
214
|
+
init_tauri();
|
|
215
|
+
var EMPTY_CLIENT_SESSION = {
|
|
315
216
|
user: null,
|
|
316
217
|
session: null,
|
|
317
218
|
accounts: null
|
|
318
219
|
};
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
220
|
+
function createEmptyClientSession() {
|
|
221
|
+
return { ...EMPTY_CLIENT_SESSION, providers: [] };
|
|
222
|
+
}
|
|
223
|
+
function isBrowser() {
|
|
224
|
+
return typeof window !== "undefined";
|
|
225
|
+
}
|
|
226
|
+
function createBrowserEnvironment(env = {}) {
|
|
227
|
+
return {
|
|
228
|
+
isBrowser,
|
|
229
|
+
isTauri: () => isBrowser() && isTauri(),
|
|
230
|
+
origin: () => window.location.origin,
|
|
231
|
+
href: () => window.location.href,
|
|
232
|
+
navigate: (url) => {
|
|
233
|
+
window.location.href = url;
|
|
234
|
+
},
|
|
235
|
+
...env
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
function createClientAuth({
|
|
239
|
+
client,
|
|
240
|
+
redirectTo: defaultRedirectTo,
|
|
241
|
+
setSession,
|
|
242
|
+
onReady,
|
|
243
|
+
onRefreshing,
|
|
244
|
+
replaceUrl,
|
|
245
|
+
logger = console,
|
|
246
|
+
env
|
|
247
|
+
}) {
|
|
248
|
+
const browser = createBrowserEnvironment(env);
|
|
249
|
+
function resolveRedirectTo(type, redirectTo) {
|
|
250
|
+
let next = redirectTo ?? defaultRedirectTo;
|
|
251
|
+
if (!next && browser.isBrowser())
|
|
252
|
+
next = type === "signIn" ? browser.origin() : browser.href();
|
|
253
|
+
return next;
|
|
254
|
+
}
|
|
255
|
+
function navigateTo(url) {
|
|
256
|
+
if (browser.isBrowser() && !browser.isTauri())
|
|
257
|
+
browser.navigate(url);
|
|
258
|
+
}
|
|
259
|
+
async function refresh() {
|
|
260
|
+
onRefreshing?.(true);
|
|
261
|
+
try {
|
|
262
|
+
setSession(browser.isBrowser() ? await client.refreshSession() : createEmptyClientSession());
|
|
263
|
+
} finally {
|
|
264
|
+
onRefreshing?.(false);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
async function signIn(provider, options = {}) {
|
|
268
|
+
const profile = options.profile;
|
|
269
|
+
const url = await client.signIn(provider, { redirectTo: resolveRedirectTo("signIn", options.redirectTo), profile });
|
|
270
|
+
navigateTo(url);
|
|
271
|
+
}
|
|
272
|
+
async function linkAccount(provider, options = {}) {
|
|
273
|
+
const profile = options.profile;
|
|
274
|
+
const url = await client.linkAccount(provider, { redirectTo: resolveRedirectTo("linkAccount", options.redirectTo), profile });
|
|
275
|
+
navigateTo(url);
|
|
276
|
+
}
|
|
277
|
+
async function unlinkAccount(provider) {
|
|
278
|
+
const ok = await client.unlinkAccount(provider);
|
|
279
|
+
if (!ok)
|
|
280
|
+
logger.error("Failed to unlink account");
|
|
281
|
+
}
|
|
282
|
+
function mount() {
|
|
283
|
+
if (!browser.isBrowser())
|
|
284
|
+
return () => {
|
|
285
|
+
};
|
|
286
|
+
const unsubscribe = client.onSessionChange(setSession);
|
|
287
|
+
let disposed = false;
|
|
288
|
+
let cleanup;
|
|
289
|
+
void (async () => {
|
|
290
|
+
try {
|
|
291
|
+
const handled = await client.handleRedirectCallback(replaceUrl);
|
|
292
|
+
if (!handled)
|
|
293
|
+
await refresh();
|
|
294
|
+
} finally {
|
|
295
|
+
if (!disposed)
|
|
296
|
+
onReady?.();
|
|
297
|
+
}
|
|
298
|
+
})();
|
|
299
|
+
if (browser.isTauri()) {
|
|
300
|
+
void (async () => {
|
|
301
|
+
const unlisten = await client.startTauriBridge();
|
|
302
|
+
if (disposed)
|
|
303
|
+
unlisten?.();
|
|
304
|
+
else
|
|
305
|
+
cleanup = unlisten ?? void 0;
|
|
306
|
+
})();
|
|
307
|
+
}
|
|
308
|
+
return () => {
|
|
309
|
+
disposed = true;
|
|
310
|
+
cleanup?.();
|
|
311
|
+
cleanup = void 0;
|
|
312
|
+
unsubscribe();
|
|
313
|
+
};
|
|
314
|
+
}
|
|
315
|
+
return {
|
|
316
|
+
mount,
|
|
317
|
+
controls: {
|
|
318
|
+
signIn,
|
|
319
|
+
linkAccount,
|
|
320
|
+
unlinkAccount,
|
|
321
|
+
signOut: client.signOut,
|
|
322
|
+
refresh,
|
|
323
|
+
fetch: client.fetch
|
|
324
|
+
}
|
|
325
|
+
};
|
|
326
|
+
}
|
|
322
327
|
|
|
323
328
|
// src/client/vanilla/index.ts
|
|
324
329
|
init_tauri();
|
|
@@ -446,8 +451,8 @@ function createAuthClient({ baseUrl, scheme = "gau" }) {
|
|
|
446
451
|
return false;
|
|
447
452
|
}
|
|
448
453
|
async function signOut() {
|
|
449
|
-
clearSessionToken();
|
|
450
454
|
const token = getSessionToken();
|
|
455
|
+
clearSessionToken();
|
|
451
456
|
const headers = token ? { Authorization: `Bearer ${token}` } : void 0;
|
|
452
457
|
await fetch(`${baseUrl}/signout`, token ? { method: "POST", headers } : { method: "POST", credentials: "include" });
|
|
453
458
|
await refreshSession();
|
|
@@ -623,116 +628,55 @@ function AuthProvider(props) {
|
|
|
623
628
|
if (!isServer2 && isTauri())
|
|
624
629
|
installSolidStartFetchBridge();
|
|
625
630
|
const client = createAuthClient({
|
|
626
|
-
baseUrl
|
|
631
|
+
baseUrl,
|
|
632
|
+
scheme
|
|
627
633
|
});
|
|
628
634
|
const hasExternalSession = () => props.session !== void 0;
|
|
629
635
|
const [mounted, setMounted] = createSignal(false);
|
|
630
|
-
const
|
|
631
|
-
|
|
632
|
-
return { ...NULL_SESSION, providers: [] };
|
|
633
|
-
return client.refreshSession();
|
|
634
|
-
};
|
|
635
|
-
const [internalSession, { refetch: internalRefetch }] = createResource(
|
|
636
|
-
mounted,
|
|
637
|
-
fetchSession,
|
|
638
|
-
{ initialValue: { ...NULL_SESSION, providers: [] } }
|
|
639
|
-
);
|
|
636
|
+
const [isRefreshing, setIsRefreshing] = createSignal(false);
|
|
637
|
+
const [isReady, setIsReady] = createSignal(false);
|
|
640
638
|
const [clientOverride, setClientOverride] = createSignal(null);
|
|
639
|
+
const [clientSession, setClientSession] = createSignal(null);
|
|
640
|
+
const setResolvedSession = (next) => {
|
|
641
|
+
if (hasExternalSession())
|
|
642
|
+
setClientOverride(next);
|
|
643
|
+
else
|
|
644
|
+
setClientSession(next);
|
|
645
|
+
};
|
|
641
646
|
const session = createMemo(() => {
|
|
642
647
|
const override = clientOverride();
|
|
643
648
|
if (override !== null)
|
|
644
649
|
return override;
|
|
645
650
|
if (hasExternalSession()) {
|
|
646
651
|
const ext = props.session();
|
|
647
|
-
return
|
|
652
|
+
return clientOverride() ?? ext ?? createEmptyClientSession();
|
|
648
653
|
}
|
|
649
|
-
return
|
|
654
|
+
return clientSession() ?? createEmptyClientSession();
|
|
650
655
|
});
|
|
651
656
|
const isLoading = createMemo(() => {
|
|
652
657
|
if (hasExternalSession()) {
|
|
653
658
|
const s = props.session;
|
|
654
659
|
return s?.loading ?? false;
|
|
655
660
|
}
|
|
656
|
-
return !mounted() ||
|
|
661
|
+
return !mounted() || !isReady() || clientSession() === null && isRefreshing();
|
|
657
662
|
});
|
|
658
|
-
const
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
}
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
const inTauri = !isServer2 && isTauri();
|
|
668
|
-
let finalRedirectTo = redirectTo ?? props.redirectTo;
|
|
669
|
-
if (inTauri) {
|
|
670
|
-
const { signInWithTauri: signInWithTauri2 } = await Promise.resolve().then(() => (init_tauri(), tauri_exports));
|
|
671
|
-
await signInWithTauri2(provider, baseUrl, scheme, finalRedirectTo, profile);
|
|
672
|
-
return;
|
|
673
|
-
}
|
|
674
|
-
if (!finalRedirectTo && !isServer2)
|
|
675
|
-
finalRedirectTo = window.location.origin;
|
|
676
|
-
const url = await client.signIn(provider, { redirectTo: finalRedirectTo, profile });
|
|
677
|
-
if (!isServer2)
|
|
678
|
-
window.location.href = url;
|
|
679
|
-
}
|
|
680
|
-
async function linkAccount(provider, { redirectTo, profile } = {}) {
|
|
681
|
-
if (!isServer2 && isTauri()) {
|
|
682
|
-
const { linkAccountWithTauri: linkAccountWithTauri2 } = await Promise.resolve().then(() => (init_tauri(), tauri_exports));
|
|
683
|
-
await linkAccountWithTauri2(provider, baseUrl, scheme, redirectTo, profile);
|
|
684
|
-
return;
|
|
663
|
+
const auth = createClientAuth({
|
|
664
|
+
client,
|
|
665
|
+
redirectTo: untrack(() => props.redirectTo),
|
|
666
|
+
setSession: setResolvedSession,
|
|
667
|
+
onReady: () => {
|
|
668
|
+
setIsReady(true);
|
|
669
|
+
},
|
|
670
|
+
onRefreshing: (refreshing) => {
|
|
671
|
+
setIsRefreshing(refreshing);
|
|
685
672
|
}
|
|
686
|
-
|
|
687
|
-
if (!finalRedirectTo && !isServer2)
|
|
688
|
-
finalRedirectTo = window.location.href;
|
|
689
|
-
const url = await client.linkAccount(provider, { redirectTo: finalRedirectTo, profile });
|
|
690
|
-
if (!isServer2)
|
|
691
|
-
window.location.href = url;
|
|
692
|
-
}
|
|
693
|
-
async function unlinkAccount(provider) {
|
|
694
|
-
const ok = await client.unlinkAccount(provider);
|
|
695
|
-
if (ok)
|
|
696
|
-
await refetch();
|
|
697
|
-
else
|
|
698
|
-
console.error("Failed to unlink account");
|
|
699
|
-
}
|
|
700
|
-
const signOut = async () => {
|
|
701
|
-
await client.signOut();
|
|
702
|
-
await refetch();
|
|
703
|
-
};
|
|
673
|
+
});
|
|
704
674
|
onMount2(() => {
|
|
705
675
|
if (!untrack(hasExternalSession))
|
|
706
676
|
setMounted(true);
|
|
707
|
-
|
|
708
|
-
if (!isTauri()) {
|
|
709
|
-
void (async () => {
|
|
710
|
-
const handled = await client.handleRedirectCallback();
|
|
711
|
-
if (handled)
|
|
712
|
-
await doRefetch();
|
|
713
|
-
})();
|
|
714
|
-
return;
|
|
715
|
-
}
|
|
716
|
-
let disposed = false;
|
|
717
|
-
let unlisten;
|
|
718
|
-
void (async () => {
|
|
719
|
-
const { startAuthBridge: startAuthBridge2 } = await Promise.resolve().then(() => (init_tauri(), tauri_exports));
|
|
720
|
-
const maybeUnlisten = await startAuthBridge2(baseUrl, scheme, async (token) => {
|
|
721
|
-
await client.applySessionToken(token);
|
|
722
|
-
await doRefetch();
|
|
723
|
-
});
|
|
724
|
-
if (disposed)
|
|
725
|
-
maybeUnlisten?.();
|
|
726
|
-
else
|
|
727
|
-
unlisten = maybeUnlisten ?? void 0;
|
|
728
|
-
})();
|
|
729
|
-
onCleanup(() => {
|
|
730
|
-
disposed = true;
|
|
731
|
-
unlisten?.();
|
|
732
|
-
unlisten = void 0;
|
|
733
|
-
});
|
|
677
|
+
onCleanup(auth.mount());
|
|
734
678
|
});
|
|
735
|
-
return <AuthContext.Provider value={{ session, isLoading,
|
|
679
|
+
return <AuthContext.Provider value={{ session, isLoading, ...auth.controls }}>
|
|
736
680
|
{props.children}
|
|
737
681
|
</AuthContext.Provider>;
|
|
738
682
|
}
|