| |
| import { SupabaseClientOptions, TracePropagationOptions } from './types' |
|
|
| function normalizeTracePropagation( |
| value: TracePropagationOptions | boolean | undefined |
| ): TracePropagationOptions | undefined { |
| return typeof value === 'boolean' ? { enabled: value } : value |
| } |
|
|
| export function uuid() { |
| return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { |
| var r = (Math.random() * 16) | 0, |
| v = c == 'x' ? r : (r & 0x3) | 0x8 |
| return v.toString(16) |
| }) |
| } |
|
|
| export function ensureTrailingSlash(url: string): string { |
| return url.endsWith('/') ? url : url + '/' |
| } |
|
|
| export const isBrowser = () => typeof window !== 'undefined' |
|
|
| export type ResolvedSupabaseClientOptions<SchemaName> = Omit< |
| Required<SupabaseClientOptions<SchemaName>>, |
| 'tracePropagation' |
| > & { |
| tracePropagation: TracePropagationOptions |
| } |
|
|
| export function applySettingDefaults< |
| Database = any, |
| SchemaName extends string & keyof Database = 'public' extends keyof Database |
| ? 'public' |
| : string & keyof Database, |
| >( |
| options: SupabaseClientOptions<SchemaName>, |
| defaults: SupabaseClientOptions<any> |
| ): ResolvedSupabaseClientOptions<SchemaName> { |
| const { |
| db: dbOptions, |
| auth: authOptions, |
| realtime: realtimeOptions, |
| global: globalOptions, |
| } = options |
| const { |
| db: DEFAULT_DB_OPTIONS, |
| auth: DEFAULT_AUTH_OPTIONS, |
| realtime: DEFAULT_REALTIME_OPTIONS, |
| global: DEFAULT_GLOBAL_OPTIONS, |
| } = defaults |
|
|
| |
| const tracePropagationOptions = normalizeTracePropagation(options.tracePropagation) |
| const DEFAULT_TRACE_PROPAGATION_OPTIONS = normalizeTracePropagation(defaults.tracePropagation) |
|
|
| const result: ResolvedSupabaseClientOptions<SchemaName> = { |
| db: { |
| ...DEFAULT_DB_OPTIONS, |
| ...dbOptions, |
| }, |
| auth: { |
| ...DEFAULT_AUTH_OPTIONS, |
| ...authOptions, |
| }, |
| realtime: { |
| ...DEFAULT_REALTIME_OPTIONS, |
| ...realtimeOptions, |
| }, |
| storage: {}, |
| global: { |
| ...DEFAULT_GLOBAL_OPTIONS, |
| ...globalOptions, |
| headers: { |
| ...(DEFAULT_GLOBAL_OPTIONS?.headers ?? {}), |
| ...(globalOptions?.headers ?? {}), |
| }, |
| }, |
| tracePropagation: { |
| enabled: |
| tracePropagationOptions?.enabled ?? DEFAULT_TRACE_PROPAGATION_OPTIONS?.enabled ?? false, |
| respectSamplingDecision: |
| tracePropagationOptions?.respectSamplingDecision ?? |
| DEFAULT_TRACE_PROPAGATION_OPTIONS?.respectSamplingDecision ?? |
| true, |
| }, |
| accessToken: async () => '', |
| } |
|
|
| if (options.accessToken) { |
| result.accessToken = options.accessToken |
| } else { |
| |
| delete (result as any).accessToken |
| } |
|
|
| return result |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| export function validateSupabaseUrl(supabaseUrl: string): URL { |
| const trimmedUrl = supabaseUrl?.trim() |
|
|
| if (!trimmedUrl) { |
| throw new Error('supabaseUrl is required.') |
| } |
|
|
| if (!trimmedUrl.match(/^https?:\/\//i)) { |
| throw new Error('Invalid supabaseUrl: Must be a valid HTTP or HTTPS URL.') |
| } |
|
|
| try { |
| return new URL(ensureTrailingSlash(trimmedUrl)) |
| } catch { |
| throw Error('Invalid supabaseUrl: Provided URL is malformed.') |
| } |
| } |
|
|