@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.
Files changed (71) hide show
  1. package/dist/chunk-6HKZAQHT.js +1 -0
  2. package/dist/chunk-6HKZAQHT.js.map +1 -0
  3. package/dist/chunk-MXZ363UZ.js +1 -0
  4. package/dist/chunk-MXZ363UZ.js.map +1 -0
  5. package/dist/chunk-NHENQLYI.js +1 -0
  6. package/dist/chunk-NHENQLYI.js.map +1 -0
  7. package/dist/chunk-V6AIGB33.js +1 -0
  8. package/dist/chunk-V6AIGB33.js.map +1 -0
  9. package/dist/chunk-VXWI4D7H.js +1 -0
  10. package/dist/chunk-VXWI4D7H.js.map +1 -0
  11. package/dist/src/adapters/drizzle/index.d.ts +1 -1
  12. package/dist/src/adapters/drizzle/index.js +1 -1
  13. package/dist/src/adapters/drizzle/pg.d.ts +3 -26
  14. package/dist/src/adapters/drizzle/pg.d.ts.map +1 -1
  15. package/dist/src/adapters/drizzle/shared.d.ts +49 -0
  16. package/dist/src/adapters/drizzle/shared.d.ts.map +1 -0
  17. package/dist/src/adapters/drizzle/sqlite.d.ts +3 -26
  18. package/dist/src/adapters/drizzle/sqlite.d.ts.map +1 -1
  19. package/dist/src/adapters/index.js +1 -1
  20. package/dist/src/client/shared/clientAuth.d.ts +57 -0
  21. package/dist/src/client/shared/clientAuth.d.ts.map +1 -0
  22. package/dist/src/client/solid/index.d.ts +3 -14
  23. package/dist/src/client/solid/index.d.ts.map +1 -1
  24. package/dist/src/client/solid/index.jsx +160 -216
  25. package/dist/src/client/solid2/Protected.d.ts +5 -0
  26. package/dist/src/client/solid2/Protected.d.ts.map +1 -0
  27. package/dist/src/client/solid2/index.d.ts +36 -0
  28. package/dist/src/client/solid2/index.d.ts.map +1 -0
  29. package/dist/src/client/solid2/index.jsx +708 -0
  30. package/dist/src/client/svelte/index.svelte.d.ts +3 -14
  31. package/dist/src/client/svelte/index.svelte.d.ts.map +1 -1
  32. package/dist/src/client/svelte/index.svelte.js +1 -1
  33. package/dist/src/client/svelte/index.svelte.js.map +1 -1
  34. package/dist/src/client/vanilla/index.js +1 -1
  35. package/dist/src/client/vanilla/index.js.map +1 -1
  36. package/dist/src/core/handlers/callback.d.ts.map +1 -1
  37. package/dist/src/core/handlers/index.js +1 -1
  38. package/dist/src/core/index.js +1 -1
  39. package/dist/src/core/serverSession.d.ts +13 -0
  40. package/dist/src/core/serverSession.d.ts.map +1 -0
  41. package/dist/src/index.js +1 -1
  42. package/dist/src/jwt/index.js +1 -1
  43. package/dist/src/oauth/index.d.ts +13 -11
  44. package/dist/src/oauth/index.d.ts.map +1 -1
  45. package/dist/src/oauth/index.js +1 -1
  46. package/dist/src/oauth/index.js.map +1 -1
  47. package/dist/src/oauth/providers/discord.d.ts.map +1 -1
  48. package/dist/src/oauth/providers/facebook.d.ts.map +1 -1
  49. package/dist/src/oauth/providers/github.d.ts.map +1 -1
  50. package/dist/src/oauth/providers/google.d.ts.map +1 -1
  51. package/dist/src/oauth/providers/microsoft.d.ts.map +1 -1
  52. package/dist/src/oauth/utils.d.ts +26 -0
  53. package/dist/src/oauth/utils.d.ts.map +1 -1
  54. package/dist/src/runtimes/index.js +1 -1
  55. package/dist/src/runtimes/tauri/index.d.ts.map +1 -1
  56. package/dist/src/runtimes/tauri/index.js +1 -1
  57. package/dist/src/solidstart/index.d.ts +4 -4
  58. package/dist/src/solidstart/index.d.ts.map +1 -1
  59. package/dist/src/solidstart/index.js +1 -1
  60. package/dist/src/solidstart/index.js.map +1 -1
  61. package/dist/src/sveltekit/index.d.ts +2 -2
  62. package/dist/src/sveltekit/index.d.ts.map +1 -1
  63. package/dist/src/sveltekit/index.js +1 -1
  64. package/dist/src/sveltekit/index.js.map +1 -1
  65. package/package.json +14 -4
  66. package/dist/chunk-DVVL3GFT.js +0 -1
  67. package/dist/chunk-DVVL3GFT.js.map +0 -1
  68. package/dist/chunk-MRKRGLUT.js +0 -1
  69. package/dist/chunk-MRKRGLUT.js.map +0 -1
  70. package/dist/chunk-PL7MV7OC.js +0 -1
  71. 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":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAsC,KAAK,EAAE,MAAM,aAAa,CAAA;AACvF,OAAO,KAAK,EAAE,UAAU,EAAW,MAAM,qBAAqB,CAAA;AAC9D,OAAO,KAAK,EAAW,OAAO,EAA6B,MAAM,YAAY,CAAA;AAG7E,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG;IAC/B,EAAE,EAAE,SAAS,CAAA;IACb,IAAI,EAAE,SAAS,CAAA;IACf,KAAK,EAAE,SAAS,CAAA;IAChB,KAAK,EAAE,SAAS,CAAA;IAChB,aAAa,EAAE,SAAS,CAAA;IACxB,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB,SAAS,EAAE,SAAS,CAAA;IACpB,SAAS,EAAE,SAAS,CAAA;CACrB,CAAA;AAED,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG;IAClC,MAAM,EAAE,SAAS,CAAA;IACjB,IAAI,EAAE,SAAS,CAAA;IACf,QAAQ,EAAE,SAAS,CAAA;IACnB,iBAAiB,EAAE,SAAS,CAAA;IAC5B,YAAY,EAAE,SAAS,CAAA;IACvB,WAAW,EAAE,SAAS,CAAA;IACtB,SAAS,EAAE,SAAS,CAAA;IACpB,SAAS,EAAE,SAAS,CAAA;IACpB,KAAK,EAAE,SAAS,CAAA;IAChB,OAAO,EAAE,SAAS,CAAA;IAClB,YAAY,CAAC,EAAE,SAAS,CAAA;CACzB,CAAA;AAED,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,GAAG,OAAO,CA2JxC"}
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 { Adapter } from '../../core/index';
4
- export type UsersTable = Table & {
5
- id: AnyColumn;
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":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAsC,KAAK,EAAE,MAAM,aAAa,CAAA;AACvF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AACjE,OAAO,KAAK,EAAW,OAAO,EAA6B,MAAM,kBAAkB,CAAA;AAInF,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG;IAC/B,EAAE,EAAE,SAAS,CAAA;IACb,IAAI,EAAE,SAAS,CAAA;IACf,KAAK,EAAE,SAAS,CAAA;IAChB,KAAK,EAAE,SAAS,CAAA;IAChB,aAAa,EAAE,SAAS,CAAA;IACxB,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB,SAAS,EAAE,SAAS,CAAA;IACpB,SAAS,EAAE,SAAS,CAAA;CACrB,CAAA;AAED,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG;IAClC,MAAM,EAAE,SAAS,CAAA;IACjB,IAAI,EAAE,SAAS,CAAA;IACf,QAAQ,EAAE,SAAS,CAAA;IACnB,iBAAiB,EAAE,SAAS,CAAA;IAC5B,YAAY,EAAE,SAAS,CAAA;IACvB,WAAW,EAAE,SAAS,CAAA;IACtB,SAAS,EAAE,SAAS,CAAA;IACpB,SAAS,EAAE,SAAS,CAAA;IACpB,KAAK,EAAE,SAAS,CAAA;IAChB,OAAO,EAAE,SAAS,CAAA;IAClB,YAAY,CAAC,EAAE,SAAS,CAAA;CACzB,CAAA;AAED,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,GAAG,OAAO,CAkJxC"}
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-DVVL3GFT.js";export{r as DrizzleAdapter,o as MemoryAdapter};//# sourceMappingURL=index.js.map
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, ProfileName, ProviderIds } from '../../core';
3
- interface AuthContextValue<TAuth = unknown> {
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,WAAW,EAAE,MAAM,YAAY,CAAA;AAQtE,UAAU,gBAAgB,CAAC,KAAK,GAAG,OAAO;IACxC,OAAO,EAAE,QAAQ,CAAC,UAAU,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IACjD,SAAS,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAA;IAC5B,MAAM,EAAE,CAAC,CAAC,SAAS,WAAW,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACxI,WAAW,EAAE,CAAC,CAAC,SAAS,WAAW,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC7I,aAAa,EAAE,CAAC,QAAQ,EAAE,WAAW,CAAC,KAAK,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC9D,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5B,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5B,KAAK,EAAE,CAAC,KAAK,EAAE,WAAW,GAAG,GAAG,EAAE,IAAI,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAA;CAC3E;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,kCAiKlF;AAED,wBAAgB,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,OAAO,KAAK,gBAAgB,CAAC,KAAK,CAAC,CAKxE;AAED,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA"}
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
- function resolveAbsoluteBase(base) {
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 resolvedBase = resolveAbsoluteBase(baseUrl);
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
- let redirectTo;
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 resolvedBase = (() => {
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
- import { createContext, createMemo, createResource, createSignal, onCleanup, onMount as onMount2, untrack, useContext } from "solid-js";
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/core/cookies.ts
244
- import { parse, serialize } from "cookie";
245
- var CSRF_MAX_AGE = 60 * 10;
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
- // src/client/solid/index.tsx
321
- init_tauri();
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 fetchSession = async (isMounted) => {
631
- if (isServer2 || !isMounted)
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 ext ?? { ...NULL_SESSION, providers: [] };
652
+ return clientOverride() ?? ext ?? createEmptyClientSession();
648
653
  }
649
- return internalSession();
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() || internalSession.loading;
661
+ return !mounted() || !isReady() || clientSession() === null && isRefreshing();
657
662
  });
658
- const refetch = async () => {
659
- if (hasExternalSession()) {
660
- const refreshed = await client.refreshSession();
661
- setClientOverride(refreshed);
662
- } else {
663
- internalRefetch();
664
- }
665
- };
666
- async function signIn(provider, { redirectTo, profile } = {}) {
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
- let finalRedirectTo = redirectTo ?? props.redirectTo;
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
- const doRefetch = untrack(() => refetch);
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, signIn, linkAccount, unlinkAccount, signOut, refresh: refetch, fetch: client.fetch }}>
679
+ return <AuthContext.Provider value={{ session, isLoading, ...auth.controls }}>
736
680
  {props.children}
737
681
  </AuthContext.Provider>;
738
682
  }