everything-dev 2.0.0-rc.0 → 2.0.0-rc.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 (125) hide show
  1. package/dist/auth-login.cjs +1 -1
  2. package/dist/auth-login.mjs +1 -1
  3. package/dist/build.cjs +2 -2
  4. package/dist/build.mjs +2 -2
  5. package/dist/bundle-fs-resolve.cjs +9 -17
  6. package/dist/bundle-fs-resolve.cjs.map +1 -1
  7. package/dist/bundle-fs-resolve.d.cts +6 -0
  8. package/dist/bundle-fs-resolve.d.mts +6 -0
  9. package/dist/bundle-fs-resolve.mjs +9 -17
  10. package/dist/bundle-fs-resolve.mjs.map +1 -1
  11. package/dist/bundle-path.cjs +48 -0
  12. package/dist/bundle-path.cjs.map +1 -0
  13. package/dist/bundle-path.mjs +45 -0
  14. package/dist/bundle-path.mjs.map +1 -0
  15. package/dist/cli/init.cjs +13 -13
  16. package/dist/cli/init.cjs.map +1 -1
  17. package/dist/cli/init.mjs +13 -13
  18. package/dist/cli/init.mjs.map +1 -1
  19. package/dist/cli/status.cjs +69 -3
  20. package/dist/cli/status.cjs.map +1 -1
  21. package/dist/cli/status.mjs +67 -4
  22. package/dist/cli/status.mjs.map +1 -1
  23. package/dist/cli/sync.cjs +1 -1
  24. package/dist/cli/sync.cjs.map +1 -1
  25. package/dist/cli/sync.mjs +1 -1
  26. package/dist/cli/sync.mjs.map +1 -1
  27. package/dist/cli/upgrade.cjs +2 -2
  28. package/dist/cli/upgrade.cjs.map +1 -1
  29. package/dist/cli/upgrade.mjs +2 -2
  30. package/dist/cli/upgrade.mjs.map +1 -1
  31. package/dist/cli.cjs +5 -7
  32. package/dist/cli.cjs.map +1 -1
  33. package/dist/cli.mjs +5 -7
  34. package/dist/cli.mjs.map +1 -1
  35. package/dist/commands/deploy.cjs +26 -16
  36. package/dist/commands/deploy.cjs.map +1 -1
  37. package/dist/commands/deploy.mjs +26 -16
  38. package/dist/commands/deploy.mjs.map +1 -1
  39. package/dist/commands/init.cjs +1 -1
  40. package/dist/commands/init.cjs.map +1 -1
  41. package/dist/commands/init.mjs +1 -1
  42. package/dist/commands/init.mjs.map +1 -1
  43. package/dist/commands/plugins.cjs +2 -2
  44. package/dist/commands/plugins.cjs.map +1 -1
  45. package/dist/commands/plugins.mjs +2 -2
  46. package/dist/commands/plugins.mjs.map +1 -1
  47. package/dist/commands/upgrade.cjs +1 -1
  48. package/dist/commands/upgrade.mjs +1 -1
  49. package/dist/components/dev-render.cjs +1 -1
  50. package/dist/components/dev-render.mjs +1 -1
  51. package/dist/config.cjs +3 -3
  52. package/dist/config.cjs.map +1 -1
  53. package/dist/config.mjs +3 -3
  54. package/dist/config.mjs.map +1 -1
  55. package/dist/contract.cjs +2 -0
  56. package/dist/contract.cjs.map +1 -1
  57. package/dist/contract.d.cts +3 -0
  58. package/dist/contract.d.mts +3 -0
  59. package/dist/contract.meta.cjs +2 -1
  60. package/dist/contract.meta.cjs.map +1 -1
  61. package/dist/contract.meta.d.cts +4 -1
  62. package/dist/contract.meta.d.mts +4 -1
  63. package/dist/contract.meta.mjs +2 -1
  64. package/dist/contract.meta.mjs.map +1 -1
  65. package/dist/contract.mjs +2 -0
  66. package/dist/contract.mjs.map +1 -1
  67. package/dist/db/driver.cjs +22 -2
  68. package/dist/db/driver.cjs.map +1 -1
  69. package/dist/db/driver.d.cts +13 -2
  70. package/dist/db/driver.d.mts +13 -2
  71. package/dist/db/driver.mjs +22 -3
  72. package/dist/db/driver.mjs.map +1 -1
  73. package/dist/db/index.cjs +1 -0
  74. package/dist/db/index.d.cts +2 -2
  75. package/dist/db/index.d.mts +2 -2
  76. package/dist/db/index.mjs +2 -2
  77. package/dist/deploy-diff.cjs +1 -1
  78. package/dist/deploy-diff.cjs.map +1 -1
  79. package/dist/deploy-diff.mjs +1 -1
  80. package/dist/deploy-diff.mjs.map +1 -1
  81. package/dist/dev-program.cjs +10 -2
  82. package/dist/dev-program.cjs.map +1 -1
  83. package/dist/dev-program.mjs +10 -2
  84. package/dist/dev-program.mjs.map +1 -1
  85. package/dist/image-deploy.cjs +65 -17
  86. package/dist/image-deploy.cjs.map +1 -1
  87. package/dist/image-deploy.mjs +64 -18
  88. package/dist/image-deploy.mjs.map +1 -1
  89. package/dist/internal/manifest-normalizer.cjs.map +1 -1
  90. package/dist/internal/manifest-normalizer.mjs.map +1 -1
  91. package/dist/plugin.d.cts +902 -1
  92. package/dist/plugin.d.mts +902 -1
  93. package/dist/publish.cjs +51 -2
  94. package/dist/publish.cjs.map +1 -1
  95. package/dist/publish.mjs +51 -4
  96. package/dist/publish.mjs.map +1 -1
  97. package/dist/resolution/session.cjs.map +1 -1
  98. package/dist/resolution/session.d.cts +5 -5
  99. package/dist/resolution/session.d.mts +5 -5
  100. package/dist/resolution/session.mjs.map +1 -1
  101. package/dist/types.d.cts +31 -1
  102. package/dist/types.d.mts +31 -1
  103. package/dist/ui/auth-guards.d.cts +78 -2
  104. package/dist/ui/auth-guards.d.mts +78 -2
  105. package/dist/ui/auth.cjs.map +1 -1
  106. package/dist/ui/auth.d.cts +4133 -7
  107. package/dist/ui/auth.d.mts +4133 -7
  108. package/dist/ui/auth.mjs.map +1 -1
  109. package/dist/ui/hydrate.cjs +2 -2
  110. package/dist/ui/hydrate.cjs.map +1 -1
  111. package/dist/ui/hydrate.mjs +2 -2
  112. package/dist/ui/hydrate.mjs.map +1 -1
  113. package/dist/utils/theme.cjs +2 -2
  114. package/dist/utils/theme.cjs.map +1 -1
  115. package/dist/utils/theme.mjs +2 -2
  116. package/dist/utils/theme.mjs.map +1 -1
  117. package/dist/version-manifest-resolve.cjs +55 -10
  118. package/dist/version-manifest-resolve.cjs.map +1 -1
  119. package/dist/version-manifest-resolve.mjs +53 -10
  120. package/dist/version-manifest-resolve.mjs.map +1 -1
  121. package/dist/workspace.cjs +26 -13
  122. package/dist/workspace.cjs.map +1 -1
  123. package/dist/workspace.mjs +26 -14
  124. package/dist/workspace.mjs.map +1 -1
  125. package/package.json +11 -10
@@ -22,11 +22,87 @@ interface AuthGuardArgs {
22
22
  }
23
23
  declare function requireSession({ context, location }: AuthGuardArgs): Promise<{
24
24
  auth: AuthContext;
25
- session: any;
25
+ session: {
26
+ user: import("better-auth").StripEmptyObjects<{
27
+ id: string;
28
+ createdAt: Date;
29
+ updatedAt: Date;
30
+ email: string;
31
+ emailVerified: boolean;
32
+ name: string;
33
+ image?: string | null | undefined;
34
+ } & {} & {
35
+ locale?: string | null | undefined;
36
+ } & {
37
+ banned: boolean | null | undefined;
38
+ } & {
39
+ banExpires?: Date | null | undefined;
40
+ banReason?: string | null | undefined;
41
+ role?: string | null | undefined;
42
+ } & {
43
+ isAnonymous: boolean | null | undefined;
44
+ } & {} & {} & {
45
+ phoneNumber?: string | null | undefined;
46
+ phoneNumberVerified?: boolean | null | undefined;
47
+ }>;
48
+ session: import("better-auth").StripEmptyObjects<{
49
+ id: string;
50
+ createdAt: Date;
51
+ updatedAt: Date;
52
+ userId: string;
53
+ expiresAt: Date;
54
+ token: string;
55
+ ipAddress?: string | null | undefined;
56
+ userAgent?: string | null | undefined;
57
+ } & {} & {} & {} & {
58
+ impersonatedBy?: string | null | undefined;
59
+ } & {} & {
60
+ activeOrganizationId?: string | null | undefined;
61
+ activeTeamId?: string | null | undefined;
62
+ }>;
63
+ };
26
64
  }>;
27
65
  declare function requireAdmin(args: AuthGuardArgs): Promise<{
28
66
  auth: AuthContext;
29
- session: any;
67
+ session: {
68
+ user: import("better-auth").StripEmptyObjects<{
69
+ id: string;
70
+ createdAt: Date;
71
+ updatedAt: Date;
72
+ email: string;
73
+ emailVerified: boolean;
74
+ name: string;
75
+ image?: string | null | undefined;
76
+ } & {} & {
77
+ locale?: string | null | undefined;
78
+ } & {
79
+ banned: boolean | null | undefined;
80
+ } & {
81
+ banExpires?: Date | null | undefined;
82
+ banReason?: string | null | undefined;
83
+ role?: string | null | undefined;
84
+ } & {
85
+ isAnonymous: boolean | null | undefined;
86
+ } & {} & {} & {
87
+ phoneNumber?: string | null | undefined;
88
+ phoneNumberVerified?: boolean | null | undefined;
89
+ }>;
90
+ session: import("better-auth").StripEmptyObjects<{
91
+ id: string;
92
+ createdAt: Date;
93
+ updatedAt: Date;
94
+ userId: string;
95
+ expiresAt: Date;
96
+ token: string;
97
+ ipAddress?: string | null | undefined;
98
+ userAgent?: string | null | undefined;
99
+ } & {} & {} & {} & {
100
+ impersonatedBy?: string | null | undefined;
101
+ } & {} & {
102
+ activeOrganizationId?: string | null | undefined;
103
+ activeTeamId?: string | null | undefined;
104
+ }>;
105
+ };
30
106
  }>;
31
107
  /**
32
108
  * Clears private and public query data on sign-out while leaving an explicit
@@ -22,11 +22,87 @@ interface AuthGuardArgs {
22
22
  }
23
23
  declare function requireSession({ context, location }: AuthGuardArgs): Promise<{
24
24
  auth: AuthContext;
25
- session: any;
25
+ session: {
26
+ user: import("better-auth").StripEmptyObjects<{
27
+ id: string;
28
+ createdAt: Date;
29
+ updatedAt: Date;
30
+ email: string;
31
+ emailVerified: boolean;
32
+ name: string;
33
+ image?: string | null | undefined;
34
+ } & {} & {
35
+ locale?: string | null | undefined;
36
+ } & {
37
+ banned: boolean | null | undefined;
38
+ } & {
39
+ banExpires?: Date | null | undefined;
40
+ banReason?: string | null | undefined;
41
+ role?: string | null | undefined;
42
+ } & {
43
+ isAnonymous: boolean | null | undefined;
44
+ } & {} & {} & {
45
+ phoneNumber?: string | null | undefined;
46
+ phoneNumberVerified?: boolean | null | undefined;
47
+ }>;
48
+ session: import("better-auth").StripEmptyObjects<{
49
+ id: string;
50
+ createdAt: Date;
51
+ updatedAt: Date;
52
+ userId: string;
53
+ expiresAt: Date;
54
+ token: string;
55
+ ipAddress?: string | null | undefined;
56
+ userAgent?: string | null | undefined;
57
+ } & {} & {} & {} & {
58
+ impersonatedBy?: string | null | undefined;
59
+ } & {} & {
60
+ activeOrganizationId?: string | null | undefined;
61
+ activeTeamId?: string | null | undefined;
62
+ }>;
63
+ };
26
64
  }>;
27
65
  declare function requireAdmin(args: AuthGuardArgs): Promise<{
28
66
  auth: AuthContext;
29
- session: any;
67
+ session: {
68
+ user: import("better-auth").StripEmptyObjects<{
69
+ id: string;
70
+ createdAt: Date;
71
+ updatedAt: Date;
72
+ email: string;
73
+ emailVerified: boolean;
74
+ name: string;
75
+ image?: string | null | undefined;
76
+ } & {} & {
77
+ locale?: string | null | undefined;
78
+ } & {
79
+ banned: boolean | null | undefined;
80
+ } & {
81
+ banExpires?: Date | null | undefined;
82
+ banReason?: string | null | undefined;
83
+ role?: string | null | undefined;
84
+ } & {
85
+ isAnonymous: boolean | null | undefined;
86
+ } & {} & {} & {
87
+ phoneNumber?: string | null | undefined;
88
+ phoneNumberVerified?: boolean | null | undefined;
89
+ }>;
90
+ session: import("better-auth").StripEmptyObjects<{
91
+ id: string;
92
+ createdAt: Date;
93
+ updatedAt: Date;
94
+ userId: string;
95
+ expiresAt: Date;
96
+ token: string;
97
+ ipAddress?: string | null | undefined;
98
+ userAgent?: string | null | undefined;
99
+ } & {} & {} & {} & {
100
+ impersonatedBy?: string | null | undefined;
101
+ } & {} & {
102
+ activeOrganizationId?: string | null | undefined;
103
+ activeTeamId?: string | null | undefined;
104
+ }>;
105
+ };
30
106
  }>;
31
107
  /**
32
108
  * Clears private and public query data on sign-out while leaving an explicit
@@ -1 +1 @@
1
- {"version":3,"file":"auth.cjs","names":["getRuntimeConfig","DEFAULT_DEVICE_LINK_CLIENT_ID","createBetterAuthClient","inferAdditionalFields","siwnClient","adminClient","anonymousClient","phoneNumberClient","passkeyClient","organizationClient","apiKeyClient","deviceAuthorizationClient","useRouter","useQuery"],"sources":["../../src/ui/auth.ts"],"sourcesContent":["import { apiKeyClient } from \"@better-auth/api-key/client\";\nimport { passkeyClient } from \"@better-auth/passkey/client\";\nimport { type QueryClient, useQuery } from \"@tanstack/react-query\";\nimport { useRouter } from \"@tanstack/react-router\";\nimport {\n adminClient,\n anonymousClient,\n deviceAuthorizationClient,\n inferAdditionalFields,\n organizationClient,\n phoneNumberClient,\n} from \"better-auth/client/plugins\";\nimport { createAuthClient as createBetterAuthClient } from \"better-auth/react\";\nimport type { PasskeyWalletLink, RelayedTransactionT } from \"better-near-auth\";\nimport { DEFAULT_DEVICE_LINK_CLIENT_ID, siwnClient } from \"better-near-auth/client\";\nimport type { ClientRuntimeConfig } from \"../types\";\nimport { getRuntimeConfig } from \"./runtime\";\n\ntype RuntimeAuthVariables = {\n siwn: {\n recipient?: string;\n recipients?: {\n mainnet?: string;\n testnet?: string;\n };\n };\n deviceLink?: {\n clientId?: string;\n };\n};\n\nexport type CreateAuthClientOptions = {\n runtimeConfig?: Partial<ClientRuntimeConfig>;\n headers?: HeadersInit;\n cspNonce?: string;\n};\n\ntype SiwnClientConfig = Parameters<typeof siwnClient>[0] & {\n cspNonce?: string;\n};\n\nfunction hasAuthVariables(auth: ClientRuntimeConfig[\"auth\"] | undefined): auth is NonNullable<\n ClientRuntimeConfig[\"auth\"]\n> & {\n variables: RuntimeAuthVariables;\n} {\n return !!auth && typeof auth === \"object\" && typeof auth.variables === \"object\";\n}\n\nfunction readRuntimeConfig(config?: Partial<ClientRuntimeConfig>) {\n if (config) return config;\n if (typeof window === \"undefined\") return undefined;\n try {\n return getRuntimeConfig();\n } catch {\n return undefined;\n }\n}\n\nfunction getAuthVariables(config?: Partial<ClientRuntimeConfig>): RuntimeAuthVariables {\n const runtimeConfig = readRuntimeConfig(config);\n if (!runtimeConfig || !hasAuthVariables(runtimeConfig.auth)) {\n throw new Error(\"Missing auth runtime configuration\");\n }\n return runtimeConfig.auth.variables;\n}\n\nfunction getSiwnClientConfig(options: CreateAuthClientOptions): SiwnClientConfig {\n const runtimeConfig = readRuntimeConfig(options.runtimeConfig);\n const variables = getAuthVariables(options.runtimeConfig);\n const siwn = variables.siwn;\n\n const mainnetRecipient = siwn.recipients?.mainnet ?? siwn.recipient;\n if (!mainnetRecipient) {\n throw new Error(\"Missing auth SIWN recipient\");\n }\n\n const networkId =\n runtimeConfig?.networkId ?? (mainnetRecipient.endsWith(\".testnet\") ? \"testnet\" : \"mainnet\");\n const testnetRecipient = siwn.recipients?.testnet;\n\n if (testnetRecipient) {\n return {\n recipients: { mainnet: mainnetRecipient, testnet: testnetRecipient },\n networkId,\n cspNonce: options.cspNonce,\n };\n }\n\n return { recipient: mainnetRecipient, networkId, cspNonce: options.cspNonce };\n}\n\nfunction getHostUrl(config?: Partial<ClientRuntimeConfig>) {\n const runtimeConfig = readRuntimeConfig(config);\n if (runtimeConfig?.hostUrl) return runtimeConfig.hostUrl;\n if (typeof window !== \"undefined\") return window.location.origin;\n return \"\";\n}\n\nexport function getDeviceLinkClientId(config?: Partial<ClientRuntimeConfig>): string {\n const runtimeConfig = readRuntimeConfig(config);\n const variables = runtimeConfig?.auth?.variables as RuntimeAuthVariables | undefined;\n return variables?.deviceLink?.clientId ?? DEFAULT_DEVICE_LINK_CLIENT_ID;\n}\n\nexport function createAuthClient(options: CreateAuthClientOptions = {}) {\n const nearAuthConfig = getSiwnClientConfig(options);\n\n return createBetterAuthClient({\n baseURL: getHostUrl(options.runtimeConfig),\n fetchOptions: {\n credentials: \"include\",\n ...(options.headers ? { headers: options.headers } : {}),\n },\n plugins: [\n inferAdditionalFields({\n user: {\n locale: { type: \"string\", required: false, input: true },\n },\n }),\n siwnClient(nearAuthConfig),\n adminClient(),\n anonymousClient(),\n phoneNumberClient(),\n passkeyClient(),\n organizationClient({ teams: { enabled: true } }),\n apiKeyClient(),\n deviceAuthorizationClient(),\n ],\n });\n}\n\nexport type { AuthContext } from \"./auth-guards\";\nexport {\n clearAuthenticatedQueries,\n requireAdmin,\n requireSession,\n} from \"./auth-guards\";\nexport { pluginHref, pluginPath, pluginSearch } from \"./plugin-path\";\n\nexport type AuthClient = ReturnType<typeof createAuthClient>;\ntype OrganizationListResult = Awaited<ReturnType<AuthClient[\"organization\"][\"list\"]>>;\ntype PasskeyListResult = Awaited<ReturnType<AuthClient[\"passkey\"][\"listUserPasskeys\"]>>;\n\nexport type SessionData = AuthClient[\"$Infer\"][\"Session\"];\nexport type Organization = NonNullable<OrganizationListResult[\"data\"]>[number];\nexport type Passkey = NonNullable<PasskeyListResult[\"data\"]>[number];\n\nexport function useAuthClient(): AuthClient {\n return useRouter().options.context.authClient as AuthClient;\n}\n\nexport const sessionQueryKey = [\"session\"] as const;\n\nexport function sessionQueryOptions(authClient: AuthClient) {\n return {\n queryKey: sessionQueryKey,\n queryFn: async () => {\n const { data: session, error } = await authClient.getSession({\n query: { disableCookieCache: true },\n });\n if (error) throw new Error(error.message || \"Unable to load your session\");\n return session ?? null;\n },\n staleTime: 60 * 1000,\n gcTime: 10 * 60 * 1000,\n };\n}\n\nexport async function refreshSessionCache(\n authClient: AuthClient,\n queryClient: QueryClient,\n): Promise<SessionData | null> {\n return queryClient.fetchQuery({ ...sessionQueryOptions(authClient), staleTime: 0 });\n}\n\n/**\n * Resolves the session for the root route: the query cache wins (it is kept\n * authoritative by the single sessionQueryOptions read path), and a populated\n * router-context session — the host's SSR resolution — seeds an empty cache so\n * the dehydrated state carries it to the client.\n */\nexport function resolveSessionFromCache<T>(\n queryClient: QueryClient | undefined,\n contextSession: T | null | undefined,\n): T | null | undefined {\n if (!queryClient) return contextSession;\n\n const cachedSession = queryClient.getQueryData<T | null>(sessionQueryKey);\n if (cachedSession !== undefined) return cachedSession;\n\n if (contextSession !== undefined) {\n queryClient.setQueryData(sessionQueryKey, contextSession);\n }\n return contextSession;\n}\n\nexport function useRelayHistory(session: SessionData | null | undefined, authClient: AuthClient) {\n return useQuery({\n queryKey: [\"relay-history\"],\n queryFn: async (): Promise<RelayedTransactionT[]> => {\n const res = await authClient.near.relayHistory();\n return res?.data?.transactions ?? [];\n },\n enabled: !!session,\n refetchInterval: 2000,\n });\n}\n\nexport type PasskeyWalletStatus = PasskeyWalletLink;\n\nexport type PasskeyCeremonyError = Error & { code?: string };\n\nconst UNSUPPORTED_AUTHENTICATOR_CODES = new Set([\n \"PASSKEY_UNSUPPORTED_AUTHENTICATOR\",\n \"ERROR_AUTHENTICATOR_NO_SUPPORTED_PUBKEYCREDPARAMS_ALG\",\n \"ERROR_AUTHENTICATOR_MISSING_DISCOVERABLE_CREDENTIAL_SUPPORT\",\n \"ERROR_AUTHENTICATOR_MISSING_USER_VERIFICATION_SUPPORT\",\n]);\n\nexport function isUnsupportedAuthenticatorError(error: unknown): boolean {\n if (!(error instanceof Error) || !(\"code\" in error)) return false;\n return typeof error.code === \"string\" && UNSUPPORTED_AUTHENTICATOR_CODES.has(error.code);\n}\n\nfunction toPasskeyError(\n error: { code?: string; message?: string } | null | undefined,\n fallback: string,\n): PasskeyCeremonyError {\n return Object.assign(new Error(error?.message || fallback), { code: error?.code });\n}\n\nexport async function isPasskeyAutofillAvailable(): Promise<boolean> {\n if (typeof window === \"undefined\" || !window.PublicKeyCredential) return false;\n try {\n return (await window.PublicKeyCredential.isConditionalMediationAvailable?.()) === true;\n } catch {\n return false;\n }\n}\n\nexport async function createAccountWithPasskey(\n authClient: AuthClient,\n options?: {\n onSuccess?: (result: { passkeyWallet?: PasskeyWalletStatus }) => void;\n onError?: (error: PasskeyCeremonyError) => void;\n },\n): Promise<void> {\n try {\n const { data, error } = await authClient.passkey.addPasskey();\n if (error || !data) {\n options?.onError?.(toPasskeyError(error, \"Could not create your account\"));\n return;\n }\n const { passkeyWallet } = data as { passkeyWallet?: PasskeyWalletStatus };\n options?.onSuccess?.({ passkeyWallet });\n } catch (error) {\n options?.onError?.(\n toPasskeyError(error instanceof Error ? error : null, \"Could not create your account\"),\n );\n }\n}\n\nexport async function signInWithPasskey(\n authClient: AuthClient,\n options?: {\n autoFill?: boolean;\n onSuccess?: () => void;\n onError?: (error: PasskeyCeremonyError) => void;\n },\n): Promise<void> {\n try {\n const { data, error } = await authClient.signIn.passkey({ autoFill: options?.autoFill });\n if (error || !data) {\n options?.onError?.(toPasskeyError(error, \"Passkey sign-in failed\"));\n return;\n }\n options?.onSuccess?.();\n } catch (error) {\n options?.onError?.(\n toPasskeyError(error instanceof Error ? error : null, \"Passkey sign-in failed\"),\n );\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"auth.cjs","names":["getRuntimeConfig","DEFAULT_DEVICE_LINK_CLIENT_ID","createBetterAuthClient","inferAdditionalFields","siwnClient","adminClient","anonymousClient","phoneNumberClient","passkeyClient","organizationClient","apiKeyClient","deviceAuthorizationClient","useRouter","useQuery"],"sources":["../../src/ui/auth.ts"],"sourcesContent":["import { apiKeyClient } from \"@better-auth/api-key/client\";\nimport { passkeyClient } from \"@better-auth/passkey/client\";\nimport { type QueryClient, useQuery } from \"@tanstack/react-query\";\nimport { useRouter } from \"@tanstack/react-router\";\nimport {\n adminClient,\n anonymousClient,\n deviceAuthorizationClient,\n inferAdditionalFields,\n organizationClient,\n phoneNumberClient,\n} from \"better-auth/client/plugins\";\nimport { createAuthClient as createBetterAuthClient } from \"better-auth/react\";\nimport type { PasskeyWalletLink, RelayedTransactionT } from \"better-near-auth\";\nimport { DEFAULT_DEVICE_LINK_CLIENT_ID, siwnClient } from \"better-near-auth/client\";\nimport type { ClientRuntimeConfig } from \"../types\";\nimport { getRuntimeConfig } from \"./runtime\";\n\ntype RuntimeAuthVariables = {\n siwn: {\n recipient?: string;\n recipients?: {\n mainnet?: string;\n testnet?: string;\n };\n };\n deviceLink?: {\n clientId?: string;\n };\n};\n\nexport type CreateAuthClientOptions = {\n runtimeConfig?: Partial<ClientRuntimeConfig>;\n headers?: HeadersInit;\n cspNonce?: string;\n};\n\ntype SiwnClientConfig = Parameters<typeof siwnClient>[0] & {\n cspNonce?: string;\n};\n\nfunction hasAuthVariables(auth: ClientRuntimeConfig[\"auth\"] | undefined): auth is NonNullable<\n ClientRuntimeConfig[\"auth\"]\n> & {\n variables: RuntimeAuthVariables;\n} {\n return !!auth && typeof auth === \"object\" && typeof auth.variables === \"object\";\n}\n\nfunction readRuntimeConfig(config?: Partial<ClientRuntimeConfig>) {\n if (config) return config;\n if (typeof window === \"undefined\") return undefined;\n try {\n return getRuntimeConfig();\n } catch {\n return undefined;\n }\n}\n\nfunction getAuthVariables(config?: Partial<ClientRuntimeConfig>): RuntimeAuthVariables {\n const runtimeConfig = readRuntimeConfig(config);\n if (!runtimeConfig || !hasAuthVariables(runtimeConfig.auth)) {\n throw new Error(\"Missing auth runtime configuration\");\n }\n return runtimeConfig.auth.variables;\n}\n\nfunction getSiwnClientConfig(options: CreateAuthClientOptions): SiwnClientConfig {\n const runtimeConfig = readRuntimeConfig(options.runtimeConfig);\n const variables = getAuthVariables(options.runtimeConfig);\n const siwn = variables.siwn;\n\n const mainnetRecipient = siwn.recipients?.mainnet ?? siwn.recipient;\n if (!mainnetRecipient) {\n throw new Error(\"Missing auth SIWN recipient\");\n }\n\n const networkId =\n runtimeConfig?.networkId ?? (mainnetRecipient.endsWith(\".testnet\") ? \"testnet\" : \"mainnet\");\n const testnetRecipient = siwn.recipients?.testnet;\n\n if (testnetRecipient) {\n return {\n recipients: { mainnet: mainnetRecipient, testnet: testnetRecipient },\n networkId,\n cspNonce: options.cspNonce,\n };\n }\n\n return { recipient: mainnetRecipient, networkId, cspNonce: options.cspNonce };\n}\n\nfunction getHostUrl(config?: Partial<ClientRuntimeConfig>) {\n const runtimeConfig = readRuntimeConfig(config);\n if (runtimeConfig?.hostUrl) return runtimeConfig.hostUrl;\n if (typeof window !== \"undefined\") return window.location.origin;\n return \"\";\n}\n\nexport function getDeviceLinkClientId(config?: Partial<ClientRuntimeConfig>): string {\n const runtimeConfig = readRuntimeConfig(config);\n const variables = runtimeConfig?.auth?.variables as RuntimeAuthVariables | undefined;\n return variables?.deviceLink?.clientId ?? DEFAULT_DEVICE_LINK_CLIENT_ID;\n}\n\nexport function createAuthClient(options: CreateAuthClientOptions = {}) {\n const nearAuthConfig = getSiwnClientConfig(options);\n\n return createBetterAuthClient({\n baseURL: getHostUrl(options.runtimeConfig),\n fetchOptions: {\n credentials: \"include\",\n ...(options.headers ? { headers: options.headers } : {}),\n },\n plugins: [\n inferAdditionalFields({\n user: {\n locale: { type: \"string\", required: false, input: true },\n },\n }),\n siwnClient(nearAuthConfig),\n adminClient(),\n anonymousClient(),\n phoneNumberClient(),\n passkeyClient(),\n organizationClient({ teams: { enabled: true } }),\n apiKeyClient(),\n deviceAuthorizationClient(),\n ],\n });\n}\n\nexport type { AuthContext } from \"./auth-guards\";\nexport {\n clearAuthenticatedQueries,\n requireAdmin,\n requireSession,\n} from \"./auth-guards\";\nexport { pluginHref, pluginPath, pluginSearch } from \"./plugin-path\";\n\nexport type AuthClient = ReturnType<typeof createAuthClient>;\n\nexport type SessionData = AuthClient[\"$Infer\"][\"Session\"];\n\n/**\n * Explicit shapes for the organization/passkey records — better-auth's client\n * inference collapses to `any` for these plugin endpoints, which would leak\n * `any` into every consumer union.\n */\nexport interface Organization {\n id: string;\n name: string;\n slug?: string | null;\n logo?: string | null;\n createdAt?: Date | string | null;\n metadata?: Record<string, unknown> | null;\n}\n\nexport interface Passkey {\n id: string;\n name?: string | null;\n createdAt?: Date | string | null;\n lastUsedAt?: Date | string | null;\n}\n\nexport function useAuthClient(): AuthClient {\n return useRouter().options.context.authClient as AuthClient;\n}\n\nexport const sessionQueryKey = [\"session\"] as const;\n\nexport function sessionQueryOptions(authClient: AuthClient) {\n return {\n queryKey: sessionQueryKey,\n queryFn: async () => {\n const { data: session, error } = await authClient.getSession({\n query: { disableCookieCache: true },\n });\n if (error) throw new Error(error.message || \"Unable to load your session\");\n return session ?? null;\n },\n staleTime: 60 * 1000,\n gcTime: 10 * 60 * 1000,\n };\n}\n\nexport async function refreshSessionCache(\n authClient: AuthClient,\n queryClient: QueryClient,\n): Promise<SessionData | null> {\n return queryClient.fetchQuery({ ...sessionQueryOptions(authClient), staleTime: 0 });\n}\n\n/**\n * Resolves the session for the root route: the query cache wins (it is kept\n * authoritative by the single sessionQueryOptions read path), and a populated\n * router-context session — the host's SSR resolution — seeds an empty cache so\n * the dehydrated state carries it to the client.\n */\nexport function resolveSessionFromCache<T>(\n queryClient: QueryClient | undefined,\n contextSession: T | null | undefined,\n): T | null | undefined {\n if (!queryClient) return contextSession;\n\n const cachedSession = queryClient.getQueryData<T | null>(sessionQueryKey);\n if (cachedSession !== undefined) return cachedSession;\n\n if (contextSession !== undefined) {\n queryClient.setQueryData(sessionQueryKey, contextSession);\n }\n return contextSession;\n}\n\nexport function useRelayHistory(session: SessionData | null | undefined, authClient: AuthClient) {\n return useQuery({\n queryKey: [\"relay-history\"],\n queryFn: async (): Promise<RelayedTransactionT[]> => {\n const res = await authClient.near.relayHistory();\n return res?.data?.transactions ?? [];\n },\n enabled: !!session,\n refetchInterval: 2000,\n });\n}\n\nexport type PasskeyWalletStatus = PasskeyWalletLink;\n\nexport type PasskeyCeremonyError = Error & { code?: string };\n\nconst UNSUPPORTED_AUTHENTICATOR_CODES = new Set([\n \"PASSKEY_UNSUPPORTED_AUTHENTICATOR\",\n \"ERROR_AUTHENTICATOR_NO_SUPPORTED_PUBKEYCREDPARAMS_ALG\",\n \"ERROR_AUTHENTICATOR_MISSING_DISCOVERABLE_CREDENTIAL_SUPPORT\",\n \"ERROR_AUTHENTICATOR_MISSING_USER_VERIFICATION_SUPPORT\",\n]);\n\nexport function isUnsupportedAuthenticatorError(error: unknown): boolean {\n if (!(error instanceof Error) || !(\"code\" in error)) return false;\n return typeof error.code === \"string\" && UNSUPPORTED_AUTHENTICATOR_CODES.has(error.code);\n}\n\nfunction toPasskeyError(\n error: { code?: string; message?: string } | null | undefined,\n fallback: string,\n): PasskeyCeremonyError {\n return Object.assign(new Error(error?.message || fallback), { code: error?.code });\n}\n\nexport async function isPasskeyAutofillAvailable(): Promise<boolean> {\n if (typeof window === \"undefined\" || !window.PublicKeyCredential) return false;\n try {\n return (await window.PublicKeyCredential.isConditionalMediationAvailable?.()) === true;\n } catch {\n return false;\n }\n}\n\nexport async function createAccountWithPasskey(\n authClient: AuthClient,\n options?: {\n onSuccess?: (result: { passkeyWallet?: PasskeyWalletStatus }) => void;\n onError?: (error: PasskeyCeremonyError) => void;\n },\n): Promise<void> {\n try {\n const { data, error } = await authClient.passkey.addPasskey();\n if (error || !data) {\n options?.onError?.(toPasskeyError(error, \"Could not create your account\"));\n return;\n }\n const { passkeyWallet } = data as { passkeyWallet?: PasskeyWalletStatus };\n options?.onSuccess?.({ passkeyWallet });\n } catch (error) {\n options?.onError?.(\n toPasskeyError(error instanceof Error ? error : null, \"Could not create your account\"),\n );\n }\n}\n\nexport async function signInWithPasskey(\n authClient: AuthClient,\n options?: {\n autoFill?: boolean;\n onSuccess?: () => void;\n onError?: (error: PasskeyCeremonyError) => void;\n },\n): Promise<void> {\n try {\n const { data, error } = await authClient.signIn.passkey({ autoFill: options?.autoFill });\n if (error || !data) {\n options?.onError?.(toPasskeyError(error, \"Passkey sign-in failed\"));\n return;\n }\n options?.onSuccess?.();\n } catch (error) {\n options?.onError?.(\n toPasskeyError(error instanceof Error ? error : null, \"Passkey sign-in failed\"),\n );\n }\n}\n"],"mappings":"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"}