hydrousdb 1.1.1 → 2.0.0

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/analytics/client.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["import type { HttpClient } from '../utils/http.js';\nimport type {\n AnalyticsQuery,\n AnalyticsResponse,\n DateRange,\n Filter,\n MultiMetricItem,\n RequestOptions,\n CountResult,\n DistributionItem,\n SumResult,\n TimeSeriesPoint,\n FieldTimeSeriesPoint,\n TopNItem,\n FieldStatsResult,\n FilteredRecordsResult,\n StorageStatsResult,\n} from '../types/index.js';\n\n// Typed wrapper so callers get proper return types\ntype AnalyticsResult<T> = Omit<AnalyticsResponse, 'data'> & { data: T; queryType: string; bucketKey: string | null; projectId: string };\n\nexport class AnalyticsClient {\n constructor(private readonly http: HttpClient) {}\n\n private get path() {\n // POST /api/analytics/:bucketKey/:key — both segments use bucketKey\n return `/api/analytics/${this.http.bucketKey}/${this.http.bucketKey}`;\n }\n\n // ── Raw query ─────────────────────────────────────────────────────────────\n\n /**\n * Run any analytics query with full control over the payload.\n * Prefer the typed convenience methods below for everyday use.\n */\n async query<T = unknown>(payload: AnalyticsQuery, opts?: RequestOptions): Promise<AnalyticsResult<T>> {\n return this.http.post<AnalyticsResult<T>>(this.path, payload, opts);\n }\n\n // ── count ──────────────────────────────────────────────────────────────────\n\n /**\n * Total record count, optionally scoped to a date range.\n * Server `queryType`: **\"count\"**\n *\n * @example\n * const { data } = await db.analytics.count();\n * console.log(data.count); // 1234\n *\n * // With date range\n * const { data } = await db.analytics.count({\n * dateRange: { startDate: '2025-01-01', endDate: '2025-12-31' }\n * });\n */\n async count(options?: { dateRange?: DateRange } & RequestOptions): Promise<AnalyticsResult<CountResult>> {\n return this.query<CountResult>({ queryType: 'count', dateRange: options?.dateRange }, options);\n }\n\n // ── distribution ───────────────────────────────────────────────────────────\n\n /**\n * Value distribution (histogram) for a field.\n * Server `queryType`: **\"distribution\"**\n *\n * @example\n * const { data } = await db.analytics.distribution('status');\n * // [{ value: 'active', count: 80 }, { value: 'archived', count: 20 }]\n */\n async distribution(\n field: string,\n options?: { limit?: number; order?: 'asc' | 'desc'; dateRange?: DateRange } & RequestOptions\n ): Promise<AnalyticsResult<DistributionItem[]>> {\n return this.query<DistributionItem[]>({\n queryType: 'distribution',\n field,\n limit: options?.limit,\n order: options?.order,\n dateRange: options?.dateRange,\n }, options);\n }\n\n // ── sum ────────────────────────────────────────────────────────────────────\n\n /**\n * Sum a numeric field, with optional group-by.\n * Server `queryType`: **\"sum\"**\n *\n * @example\n * const { data } = await db.analytics.sum('revenue', { groupBy: 'region' });\n */\n async sum(\n field: string,\n options?: { groupBy?: string; limit?: number; dateRange?: DateRange } & RequestOptions\n ): Promise<AnalyticsResult<SumResult>> {\n return this.query<SumResult>({\n queryType: 'sum',\n field,\n groupBy: options?.groupBy,\n limit: options?.limit,\n dateRange: options?.dateRange,\n }, options);\n }\n\n // ── timeSeries ─────────────────────────────────────────────────────────────\n\n /**\n * Record count grouped over time.\n * Server `queryType`: **\"timeSeries\"**\n *\n * @example\n * const { data } = await db.analytics.timeSeries({ granularity: 'day' });\n * // [{ date: '2025-01-01', count: 42 }, ...]\n */\n async timeSeries(options?: {\n granularity?: 'hour' | 'day' | 'week' | 'month';\n dateRange?: DateRange;\n } & RequestOptions): Promise<AnalyticsResult<TimeSeriesPoint[]>> {\n return this.query<TimeSeriesPoint[]>({\n queryType: 'timeSeries',\n granularity: options?.granularity,\n dateRange: options?.dateRange,\n }, options);\n }\n\n // ── fieldTimeSeries ────────────────────────────────────────────────────────\n\n /**\n * Aggregate a numeric field over time.\n * Server `queryType`: **\"fieldTimeSeries\"**\n *\n * @example\n * const { data } = await db.analytics.fieldTimeSeries('revenue', {\n * granularity: 'month',\n * aggregation: 'sum',\n * });\n */\n async fieldTimeSeries(\n field: string,\n options?: {\n aggregation?: 'sum' | 'avg' | 'min' | 'max' | 'count';\n granularity?: 'hour' | 'day' | 'week' | 'month';\n dateRange?: DateRange;\n } & RequestOptions\n ): Promise<AnalyticsResult<FieldTimeSeriesPoint[]>> {\n return this.query<FieldTimeSeriesPoint[]>({\n queryType: 'fieldTimeSeries',\n field,\n aggregation: options?.aggregation,\n granularity: options?.granularity,\n dateRange: options?.dateRange,\n }, options);\n }\n\n // ── topN ───────────────────────────────────────────────────────────────────\n\n /**\n * Top N most frequent values for a field.\n * Server `queryType`: **\"topN\"**\n *\n * @example\n * const { data } = await db.analytics.topN('country', 5);\n * // [{ label: 'US', value: 'US', count: 500 }, ...]\n */\n async topN(\n field: string,\n n = 10,\n options?: { labelField?: string; order?: 'asc' | 'desc'; dateRange?: DateRange } & RequestOptions\n ): Promise<AnalyticsResult<TopNItem[]>> {\n return this.query<TopNItem[]>({\n queryType: 'topN',\n field,\n n,\n labelField: options?.labelField,\n order: options?.order,\n dateRange: options?.dateRange,\n }, options);\n }\n\n // ── stats ──────────────────────────────────────────────────────────────────\n\n /**\n * Statistical summary for a numeric field: min, max, avg, stddev, p50, p90, p99.\n * Server `queryType`: **\"stats\"**\n *\n * @example\n * const { data } = await db.analytics.stats('score');\n * console.log(data.avg, data.p99);\n */\n async stats(\n field: string,\n options?: { dateRange?: DateRange } & RequestOptions\n ): Promise<AnalyticsResult<FieldStatsResult>> {\n return this.query<FieldStatsResult>({ queryType: 'stats', field, dateRange: options?.dateRange }, options);\n }\n\n // ── records ────────────────────────────────────────────────────────────────\n\n /**\n * Filtered, paginated raw records with optional field projection.\n * Supports filter ops: == != > < >= <= CONTAINS\n * Server `queryType`: **\"records\"**\n *\n * @example\n * const { data } = await db.analytics.records({\n * filters: [{ field: 'role', op: '==', value: 'admin' }],\n * selectFields: ['email', 'createdAt'],\n * limit: 25,\n * });\n * console.log(data.data, data.hasMore);\n */\n async records(options?: {\n filters?: Filter[];\n selectFields?: string[];\n limit?: number;\n offset?: number;\n orderBy?: string;\n order?: 'asc' | 'desc';\n dateRange?: DateRange;\n } & RequestOptions): Promise<AnalyticsResult<FilteredRecordsResult>> {\n return this.query<FilteredRecordsResult>({\n queryType: 'records',\n filters: options?.filters,\n selectFields: options?.selectFields,\n limit: options?.limit,\n offset: options?.offset,\n orderBy: options?.orderBy,\n order: options?.order,\n dateRange: options?.dateRange,\n }, options);\n }\n\n // ── multiMetric ────────────────────────────────────────────────────────────\n\n /**\n * Multiple aggregations in a single BigQuery call — ideal for dashboard stat cards.\n * Server `queryType`: **\"multiMetric\"**\n *\n * @example\n * const { data } = await db.analytics.multiMetric([\n * { name: 'totalRevenue', field: 'amount', aggregation: 'sum' },\n * { name: 'avgScore', field: 'score', aggregation: 'avg' },\n * { name: 'userCount', field: 'userId', aggregation: 'count' },\n * ]);\n * console.log(data.totalRevenue, data.avgScore, data.userCount);\n */\n async multiMetric(\n metrics: MultiMetricItem[],\n options?: { dateRange?: DateRange } & RequestOptions\n ): Promise<AnalyticsResult<Record<string, number>>> {\n return this.query<Record<string, number>>({\n queryType: 'multiMetric',\n metrics,\n dateRange: options?.dateRange,\n }, options);\n }\n\n // ── storageStats ───────────────────────────────────────────────────────────\n\n /**\n * Storage statistics for the bucket — total records, bytes, avg/min/max size.\n * Server `queryType`: **\"storageStats\"**\n *\n * @example\n * const { data } = await db.analytics.storageStats();\n * console.log(data.totalRecords, data.totalBytes);\n */\n async storageStats(\n options?: { dateRange?: DateRange } & RequestOptions\n ): Promise<AnalyticsResult<StorageStatsResult>> {\n return this.query<StorageStatsResult>({ queryType: 'storageStats', dateRange: options?.dateRange }, options);\n }\n\n // ── crossBucket ────────────────────────────────────────────────────────────\n\n /**\n * Compare a metric across multiple buckets in one query.\n * Server `queryType`: **\"crossBucket\"**\n *\n * @example\n * const { data } = await db.analytics.crossBucket({\n * bucketKeys: ['sales', 'refunds', 'trials'],\n * field: 'amount',\n * aggregation: 'sum',\n * });\n */\n async crossBucket(options: {\n bucketKeys: string[];\n field: string;\n aggregation?: 'sum' | 'avg' | 'min' | 'max' | 'count';\n dateRange?: DateRange;\n } & RequestOptions): Promise<AnalyticsResult<unknown>> {\n return this.query<unknown>({\n queryType: 'crossBucket',\n bucketKeys: options.bucketKeys,\n field: options.field,\n aggregation: options.aggregation,\n dateRange: options.dateRange,\n }, options);\n }\n}\n"]}
1
+ {"version":3,"sources":["../../src/analytics/client.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["import type { HttpClient } from '../utils/http.js';\nimport type {\n AnalyticsQuery,\n AnalyticsResponse,\n DateRange,\n Filter,\n MultiMetricItem,\n RequestOptions,\n CountResult,\n DistributionItem,\n SumResult,\n TimeSeriesPoint,\n FieldTimeSeriesPoint,\n TopNItem,\n FieldStatsResult,\n FilteredRecordsResult,\n StorageStatsResult,\n} from '../types/index.js';\n\n// Typed wrapper so callers get proper return types\ntype AnalyticsResult<T> = Omit<AnalyticsResponse, 'data'> & {\n data: T;\n queryType: string;\n bucketKey: string | null;\n projectId: string;\n};\n\n/** Options accepted by every analytics method */\nexport interface BucketOptions {\n /**\n * The bucket to run the analytics query against.\n * Required on all analytics calls.\n *\n * @example\n * const { data } = await db.analytics.count({ bucketKey: 'orders' });\n */\n bucketKey: string;\n}\n\nexport class AnalyticsClient {\n constructor(private readonly http: HttpClient) {}\n\n /** Builds the path for a given bucket: /api/analytics/:bucketKey/:securityKey */\n private path(bucketKey: string): string {\n return `/api/analytics/${bucketKey}/${this.http.securityKey}`;\n }\n\n // ── Raw query ─────────────────────────────────────────────────────────────\n\n /**\n * Run any analytics query with full control over the payload.\n * Prefer the typed convenience methods below for everyday use.\n */\n async query<T = unknown>(\n payload: AnalyticsQuery,\n options: BucketOptions & RequestOptions\n ): Promise<AnalyticsResult<T>> {\n const { bucketKey, ...rest } = options;\n return this.http.post<AnalyticsResult<T>>(this.path(bucketKey), payload, rest);\n }\n\n // ── count ──────────────────────────────────────────────────────────────────\n\n /**\n * Total record count, optionally scoped to a date range.\n *\n * @example\n * const { data } = await db.analytics.count({ bucketKey: 'orders' });\n * console.log(data.count);\n *\n * const { data } = await db.analytics.count({\n * bucketKey: 'orders',\n * dateRange: { startDate: '2025-01-01', endDate: '2025-12-31' },\n * });\n */\n async count(\n options: { dateRange?: DateRange } & BucketOptions & RequestOptions\n ): Promise<AnalyticsResult<CountResult>> {\n const { dateRange, ...rest } = options;\n return this.query<CountResult>({ queryType: 'count', dateRange }, rest);\n }\n\n // ── distribution ───────────────────────────────────────────────────────────\n\n /**\n * Value distribution (histogram) for a field.\n *\n * @example\n * const { data } = await db.analytics.distribution('status', { bucketKey: 'orders' });\n * // [{ value: 'active', count: 80 }, { value: 'archived', count: 20 }]\n */\n async distribution(\n field: string,\n options: { limit?: number; order?: 'asc' | 'desc'; dateRange?: DateRange } & BucketOptions & RequestOptions\n ): Promise<AnalyticsResult<DistributionItem[]>> {\n const { limit, order, dateRange, ...rest } = options;\n return this.query<DistributionItem[]>({ queryType: 'distribution', field, limit, order, dateRange }, rest);\n }\n\n // ── sum ────────────────────────────────────────────────────────────────────\n\n /**\n * Sum a numeric field, with optional group-by.\n *\n * @example\n * const { data } = await db.analytics.sum('revenue', { bucketKey: 'orders', groupBy: 'region' });\n */\n async sum(\n field: string,\n options: { groupBy?: string; limit?: number; dateRange?: DateRange } & BucketOptions & RequestOptions\n ): Promise<AnalyticsResult<SumResult>> {\n const { groupBy, limit, dateRange, ...rest } = options;\n return this.query<SumResult>({ queryType: 'sum', field, groupBy, limit, dateRange }, rest);\n }\n\n // ── timeSeries ─────────────────────────────────────────────────────────────\n\n /**\n * Record count grouped over time.\n *\n * @example\n * const { data } = await db.analytics.timeSeries({ bucketKey: 'orders', granularity: 'day' });\n * // [{ date: '2025-01-01', count: 42 }, ...]\n */\n async timeSeries(\n options: { granularity?: 'hour' | 'day' | 'week' | 'month'; dateRange?: DateRange } & BucketOptions & RequestOptions\n ): Promise<AnalyticsResult<TimeSeriesPoint[]>> {\n const { granularity, dateRange, ...rest } = options;\n return this.query<TimeSeriesPoint[]>({ queryType: 'timeSeries', granularity, dateRange }, rest);\n }\n\n // ── fieldTimeSeries ────────────────────────────────────────────────────────\n\n /**\n * Aggregate a numeric field over time.\n *\n * @example\n * const { data } = await db.analytics.fieldTimeSeries('revenue', {\n * bucketKey: 'orders',\n * granularity: 'month',\n * aggregation: 'sum',\n * });\n */\n async fieldTimeSeries(\n field: string,\n options: {\n aggregation?: 'sum' | 'avg' | 'min' | 'max' | 'count';\n granularity?: 'hour' | 'day' | 'week' | 'month';\n dateRange?: DateRange;\n } & BucketOptions & RequestOptions\n ): Promise<AnalyticsResult<FieldTimeSeriesPoint[]>> {\n const { aggregation, granularity, dateRange, ...rest } = options;\n return this.query<FieldTimeSeriesPoint[]>({ queryType: 'fieldTimeSeries', field, aggregation, granularity, dateRange }, rest);\n }\n\n // ── topN ───────────────────────────────────────────────────────────────────\n\n /**\n * Top N most frequent values for a field.\n *\n * @example\n * const { data } = await db.analytics.topN('country', 5, { bucketKey: 'users' });\n * // [{ label: 'US', value: 'US', count: 500 }, ...]\n */\n async topN(\n field: string,\n n = 10,\n options: { labelField?: string; order?: 'asc' | 'desc'; dateRange?: DateRange } & BucketOptions & RequestOptions\n ): Promise<AnalyticsResult<TopNItem[]>> {\n const { labelField, order, dateRange, ...rest } = options;\n return this.query<TopNItem[]>({ queryType: 'topN', field, n, labelField, order, dateRange }, rest);\n }\n\n // ── stats ──────────────────────────────────────────────────────────────────\n\n /**\n * Statistical summary for a numeric field: min, max, avg, stddev, p50, p90, p99.\n *\n * @example\n * const { data } = await db.analytics.stats('score', { bucketKey: 'users' });\n * console.log(data.avg, data.p99);\n */\n async stats(\n field: string,\n options: { dateRange?: DateRange } & BucketOptions & RequestOptions\n ): Promise<AnalyticsResult<FieldStatsResult>> {\n const { dateRange, ...rest } = options;\n return this.query<FieldStatsResult>({ queryType: 'stats', field, dateRange }, rest);\n }\n\n // ── records ────────────────────────────────────────────────────────────────\n\n /**\n * Filtered, paginated raw records with optional field projection.\n * Supports filter ops: == != > < >= <= CONTAINS\n *\n * @example\n * const { data } = await db.analytics.records({\n * bucketKey: 'users',\n * filters: [{ field: 'role', op: '==', value: 'admin' }],\n * selectFields: ['email', 'createdAt'],\n * limit: 25,\n * });\n */\n async records(\n options: {\n filters?: Filter[];\n selectFields?: string[];\n limit?: number;\n offset?: number;\n orderBy?: string;\n order?: 'asc' | 'desc';\n dateRange?: DateRange;\n } & BucketOptions & RequestOptions\n ): Promise<AnalyticsResult<FilteredRecordsResult>> {\n const { filters, selectFields, limit, offset, orderBy, order, dateRange, ...rest } = options;\n return this.query<FilteredRecordsResult>(\n { queryType: 'records', filters, selectFields, limit, offset, orderBy, order, dateRange },\n rest\n );\n }\n\n // ── multiMetric ────────────────────────────────────────────────────────────\n\n /**\n * Multiple aggregations in a single call — ideal for dashboard stat cards.\n *\n * @example\n * const { data } = await db.analytics.multiMetric(\n * [\n * { name: 'totalRevenue', field: 'amount', aggregation: 'sum' },\n * { name: 'avgScore', field: 'score', aggregation: 'avg' },\n * ],\n * { bucketKey: 'orders' }\n * );\n * console.log(data.totalRevenue, data.avgScore);\n */\n async multiMetric(\n metrics: MultiMetricItem[],\n options: { dateRange?: DateRange } & BucketOptions & RequestOptions\n ): Promise<AnalyticsResult<Record<string, number>>> {\n const { dateRange, ...rest } = options;\n return this.query<Record<string, number>>({ queryType: 'multiMetric', metrics, dateRange }, rest);\n }\n\n // ── storageStats ───────────────────────────────────────────────────────────\n\n /**\n * Storage statistics for a bucket — total records, bytes, avg/min/max size.\n *\n * @example\n * const { data } = await db.analytics.storageStats({ bucketKey: 'orders' });\n * console.log(data.totalRecords, data.totalBytes);\n */\n async storageStats(\n options: { dateRange?: DateRange } & BucketOptions & RequestOptions\n ): Promise<AnalyticsResult<StorageStatsResult>> {\n const { dateRange, ...rest } = options;\n return this.query<StorageStatsResult>({ queryType: 'storageStats', dateRange }, rest);\n }\n\n // ── crossBucket ────────────────────────────────────────────────────────────\n\n /**\n * Compare a metric across multiple buckets in one query.\n * Note: `bucketKey` here is used only for auth — the actual buckets\n * compared are specified via `bucketKeys`.\n *\n * @example\n * const { data } = await db.analytics.crossBucket({\n * bucketKey: 'sales-2025', // auth bucket\n * bucketKeys: ['sales-2024', 'sales-2025'],\n * field: 'amount',\n * aggregation: 'sum',\n * });\n */\n async crossBucket(\n options: {\n bucketKeys: string[];\n field: string;\n aggregation?: 'sum' | 'avg' | 'min' | 'max' | 'count';\n dateRange?: DateRange;\n } & BucketOptions & RequestOptions\n ): Promise<AnalyticsResult<unknown>> {\n const { bucketKeys, field, aggregation, dateRange, ...rest } = options;\n return this.query<unknown>({ queryType: 'crossBucket', bucketKeys, field, aggregation, dateRange }, rest);\n }\n}\n"]}
@@ -1,5 +1,5 @@
1
- import { a9 as HttpClient, _ as SignUpPayload, V as RequestOptions, $ as SignUpResponse, X as SignInPayload, Y as SignInResponse, Z as SignOutPayload, a8 as ValidateSessionResponse, U as RefreshSessionResponse, x as GetUserResponse, L as ListUsersResponse, a6 as UpdateUserPayload, a7 as UpdateUserResponse, K as PasswordChangePayload, O as PasswordResetRequestPayload, N as PasswordResetConfirmPayload, q as EmailVerifyRequestPayload, E as EmailVerifyConfirmPayload, A as AccountLockPayload, b as AccountLockResponse, g as AuthUser } from '../http-DbiqdKlw.mjs';
2
- export { W as SessionInfo } from '../http-DbiqdKlw.mjs';
1
+ import { a9 as HttpClient, _ as SignUpPayload, V as RequestOptions, $ as SignUpResponse, X as SignInPayload, Y as SignInResponse, Z as SignOutPayload, a8 as ValidateSessionResponse, U as RefreshSessionResponse, x as GetUserResponse, L as ListUsersResponse, a6 as UpdateUserPayload, a7 as UpdateUserResponse, K as PasswordChangePayload, O as PasswordResetRequestPayload, N as PasswordResetConfirmPayload, q as EmailVerifyRequestPayload, E as EmailVerifyConfirmPayload, A as AccountLockPayload, b as AccountLockResponse, g as AuthUser } from '../http-DTukpdAU.mjs';
2
+ export { W as SessionInfo } from '../http-DTukpdAU.mjs';
3
3
 
4
4
  declare class AuthClient {
5
5
  private readonly http;
@@ -1,5 +1,5 @@
1
- import { a9 as HttpClient, _ as SignUpPayload, V as RequestOptions, $ as SignUpResponse, X as SignInPayload, Y as SignInResponse, Z as SignOutPayload, a8 as ValidateSessionResponse, U as RefreshSessionResponse, x as GetUserResponse, L as ListUsersResponse, a6 as UpdateUserPayload, a7 as UpdateUserResponse, K as PasswordChangePayload, O as PasswordResetRequestPayload, N as PasswordResetConfirmPayload, q as EmailVerifyRequestPayload, E as EmailVerifyConfirmPayload, A as AccountLockPayload, b as AccountLockResponse, g as AuthUser } from '../http-DbiqdKlw.js';
2
- export { W as SessionInfo } from '../http-DbiqdKlw.js';
1
+ import { a9 as HttpClient, _ as SignUpPayload, V as RequestOptions, $ as SignUpResponse, X as SignInPayload, Y as SignInResponse, Z as SignOutPayload, a8 as ValidateSessionResponse, U as RefreshSessionResponse, x as GetUserResponse, L as ListUsersResponse, a6 as UpdateUserPayload, a7 as UpdateUserResponse, K as PasswordChangePayload, O as PasswordResetRequestPayload, N as PasswordResetConfirmPayload, q as EmailVerifyRequestPayload, E as EmailVerifyConfirmPayload, A as AccountLockPayload, b as AccountLockResponse, g as AuthUser } from '../http-DTukpdAU.js';
2
+ export { W as SessionInfo } from '../http-DTukpdAU.js';
3
3
 
4
4
  declare class AuthClient {
5
5
  private readonly http;
@@ -25,10 +25,17 @@ interface RequestOptions {
25
25
  headers?: Record<string, string>;
26
26
  }
27
27
  interface HydrousConfig {
28
- /** Your HydrousDB auth service key */
28
+ /**
29
+ * Your HydrousDB auth service key.
30
+ * Used for all /auth routes (signUp, signIn, session management, etc.)
31
+ */
29
32
  authKey: string;
30
- /** Your bucket key (used for records, analytics, and buckets services) */
31
- bucketKey: string;
33
+ /**
34
+ * Your HydrousDB security key.
35
+ * Used as the credential for records and analytics routes.
36
+ * The bucket is specified per-call via the bucketKey option on each method.
37
+ */
38
+ securityKey: string;
32
39
  /** Override the default base URL (advanced use) */
33
40
  baseUrl?: string;
34
41
  /** Request timeout in milliseconds (default: 30_000) */
@@ -335,7 +342,6 @@ interface AccountLockResponse {
335
342
  }
336
343
  type AnalyticsQueryType = 'count' | 'distribution' | 'sum' | 'timeSeries' | 'fieldTimeSeries' | 'topN' | 'stats' | 'records' | 'multiMetric' | 'storageStats' | 'crossBucket';
337
344
  interface DateRange {
338
- /** ISO date string "YYYY-MM-DD", epoch ms, or year string "26"/"2026" */
339
345
  startDate?: string;
340
346
  endDate?: string;
341
347
  year?: string;
@@ -362,9 +368,7 @@ interface AnalyticsQuery {
362
368
  orderBy?: string;
363
369
  order?: 'asc' | 'desc';
364
370
  n?: number;
365
- /** For 'multiMetric' — array of { name, field, aggregation } */
366
371
  metrics?: MultiMetricItem[];
367
- /** For 'crossBucket' — list of bucket keys to compare */
368
372
  bucketKeys?: string[];
369
373
  }
370
374
  interface CountResult {
@@ -433,15 +437,15 @@ interface HydrousErrorBody {
433
437
 
434
438
  interface HttpClientConfig {
435
439
  authKey: string;
436
- bucketKey: string;
440
+ securityKey: string;
437
441
  baseUrl?: string;
438
442
  timeout?: number;
439
443
  retries?: number;
440
444
  }
441
445
  declare class HttpClient {
442
446
  readonly baseUrl: string;
443
- readonly bucketKey: string;
444
447
  readonly authKey: string;
448
+ readonly securityKey: string;
445
449
  private readonly timeout;
446
450
  private readonly retries;
447
451
  constructor(config: HttpClientConfig);
@@ -25,10 +25,17 @@ interface RequestOptions {
25
25
  headers?: Record<string, string>;
26
26
  }
27
27
  interface HydrousConfig {
28
- /** Your HydrousDB auth service key */
28
+ /**
29
+ * Your HydrousDB auth service key.
30
+ * Used for all /auth routes (signUp, signIn, session management, etc.)
31
+ */
29
32
  authKey: string;
30
- /** Your bucket key (used for records, analytics, and buckets services) */
31
- bucketKey: string;
33
+ /**
34
+ * Your HydrousDB security key.
35
+ * Used as the credential for records and analytics routes.
36
+ * The bucket is specified per-call via the bucketKey option on each method.
37
+ */
38
+ securityKey: string;
32
39
  /** Override the default base URL (advanced use) */
33
40
  baseUrl?: string;
34
41
  /** Request timeout in milliseconds (default: 30_000) */
@@ -335,7 +342,6 @@ interface AccountLockResponse {
335
342
  }
336
343
  type AnalyticsQueryType = 'count' | 'distribution' | 'sum' | 'timeSeries' | 'fieldTimeSeries' | 'topN' | 'stats' | 'records' | 'multiMetric' | 'storageStats' | 'crossBucket';
337
344
  interface DateRange {
338
- /** ISO date string "YYYY-MM-DD", epoch ms, or year string "26"/"2026" */
339
345
  startDate?: string;
340
346
  endDate?: string;
341
347
  year?: string;
@@ -362,9 +368,7 @@ interface AnalyticsQuery {
362
368
  orderBy?: string;
363
369
  order?: 'asc' | 'desc';
364
370
  n?: number;
365
- /** For 'multiMetric' — array of { name, field, aggregation } */
366
371
  metrics?: MultiMetricItem[];
367
- /** For 'crossBucket' — list of bucket keys to compare */
368
372
  bucketKeys?: string[];
369
373
  }
370
374
  interface CountResult {
@@ -433,15 +437,15 @@ interface HydrousErrorBody {
433
437
 
434
438
  interface HttpClientConfig {
435
439
  authKey: string;
436
- bucketKey: string;
440
+ securityKey: string;
437
441
  baseUrl?: string;
438
442
  timeout?: number;
439
443
  retries?: number;
440
444
  }
441
445
  declare class HttpClient {
442
446
  readonly baseUrl: string;
443
- readonly bucketKey: string;
444
447
  readonly authKey: string;
448
+ readonly securityKey: string;
445
449
  private readonly timeout;
446
450
  private readonly retries;
447
451
  constructor(config: HttpClientConfig);
package/dist/index.d.mts CHANGED
@@ -1,8 +1,9 @@
1
1
  import { RecordsClient } from './records/index.mjs';
2
+ export { BucketOptions } from './records/index.mjs';
2
3
  import { AuthClient } from './auth/index.mjs';
3
4
  import { AnalyticsClient } from './analytics/index.mjs';
4
- import { H as HydrousErrorBody, a as HydrousConfig } from './http-DbiqdKlw.mjs';
5
- export { A as AccountLockPayload, b as AccountLockResponse, c as AnalyticsQuery, d as AnalyticsQueryType, e as AnalyticsResponse, f as ApiMeta, g as AuthUser, B as BatchDeletePayload, h as BatchDeleteResponse, i as BatchInsertPayload, j as BatchInsertResponse, k as BatchResult, l as BatchUpdateItem, m as BatchUpdatePayload, n as BatchUpdateResponse, C as CountResult, D as DateRange, o as DeleteRecordResponse, p as DistributionItem, E as EmailVerifyConfirmPayload, q as EmailVerifyRequestPayload, F as FieldStatsResult, r as FieldTimeSeriesPoint, s as Filter, t as FilterOp, u as FilteredRecordsResult, G as GetRecordOptions, v as GetRecordResponse, w as GetSnapshotResponse, x as GetUserResponse, y as HistoryEntry, z as HydrousRecord, I as InsertRecordPayload, J as InsertRecordResponse, L as ListUsersResponse, M as MultiMetricItem, P as PaginationMeta, K as PasswordChangePayload, N as PasswordResetConfirmPayload, O as PasswordResetRequestPayload, Q as QueryOptions, R as QueryResponse, S as RecordData, T as RecordExistsInfo, U as RefreshSessionResponse, V as RequestOptions, W as SessionInfo, X as SignInPayload, Y as SignInResponse, Z as SignOutPayload, _ as SignUpPayload, $ as SignUpResponse, a0 as StorageStatsResult, a1 as SumResult, a2 as TimeSeriesPoint, a3 as TopNItem, a4 as UpdateRecordPayload, a5 as UpdateRecordResponse, a6 as UpdateUserPayload, a7 as UpdateUserResponse, a8 as ValidateSessionResponse } from './http-DbiqdKlw.mjs';
5
+ import { H as HydrousErrorBody, a as HydrousConfig } from './http-DTukpdAU.mjs';
6
+ export { A as AccountLockPayload, b as AccountLockResponse, c as AnalyticsQuery, d as AnalyticsQueryType, e as AnalyticsResponse, f as ApiMeta, g as AuthUser, B as BatchDeletePayload, h as BatchDeleteResponse, i as BatchInsertPayload, j as BatchInsertResponse, k as BatchResult, l as BatchUpdateItem, m as BatchUpdatePayload, n as BatchUpdateResponse, C as CountResult, D as DateRange, o as DeleteRecordResponse, p as DistributionItem, E as EmailVerifyConfirmPayload, q as EmailVerifyRequestPayload, F as FieldStatsResult, r as FieldTimeSeriesPoint, s as Filter, t as FilterOp, u as FilteredRecordsResult, G as GetRecordOptions, v as GetRecordResponse, w as GetSnapshotResponse, x as GetUserResponse, y as HistoryEntry, z as HydrousRecord, I as InsertRecordPayload, J as InsertRecordResponse, L as ListUsersResponse, M as MultiMetricItem, P as PaginationMeta, K as PasswordChangePayload, N as PasswordResetConfirmPayload, O as PasswordResetRequestPayload, Q as QueryOptions, R as QueryResponse, S as RecordData, T as RecordExistsInfo, U as RefreshSessionResponse, V as RequestOptions, W as SessionInfo, X as SignInPayload, Y as SignInResponse, Z as SignOutPayload, _ as SignUpPayload, $ as SignUpResponse, a0 as StorageStatsResult, a1 as SumResult, a2 as TimeSeriesPoint, a3 as TopNItem, a4 as UpdateRecordPayload, a5 as UpdateRecordResponse, a6 as UpdateUserPayload, a7 as UpdateUserResponse, a8 as ValidateSessionResponse } from './http-DTukpdAU.mjs';
6
7
 
7
8
  /**
8
9
  * Thrown for any non-2xx response from the HydrousDB API.
@@ -35,22 +36,27 @@ declare class HydrousTimeoutError extends Error {
35
36
  /**
36
37
  * The main entry point for the HydrousDB SDK.
37
38
  *
39
+ * Initialise once with your `authKey` and `securityKey`.
40
+ * Every records and analytics call then takes a `bucketKey` option
41
+ * so a single client instance can work across multiple buckets.
42
+ *
38
43
  * @example
39
44
  * import { createClient } from 'hydrousdb';
40
45
  *
41
46
  * const db = createClient({
42
- * authKey: 'your-auth-key',
43
- * bucketKey: 'your-bucket',
47
+ * authKey: 'ak_...', // for /auth routes
48
+ * securityKey: 'sk_...', // credential for records & analytics
44
49
  * });
45
50
  *
46
- * // Records
47
- * const { data } = await db.records.get('rec_abc123');
51
+ * // Records — pass bucketKey on every call
52
+ * const { data } = await db.records.get('rec_abc123', { bucketKey: 'users' });
53
+ * await db.records.insert({ values: { name: 'Alice' } }, { bucketKey: 'users' });
48
54
  *
49
- * // Auth
55
+ * // Auth — no bucketKey needed
50
56
  * const { data, session } = await db.auth.signIn({ email: 'a@b.com', password: '...' });
51
57
  *
52
- * // Analytics
53
- * const { data } = await db.analytics.count();
58
+ * // Analytics — pass bucketKey on every call
59
+ * const { data } = await db.analytics.count({ bucketKey: 'orders' });
54
60
  */
55
61
  declare class HydrousClient {
56
62
  /** Record CRUD and batch operations */
@@ -66,7 +72,7 @@ declare class HydrousClient {
66
72
  * Create a HydrousDB client.
67
73
  *
68
74
  * @example
69
- * const db = createClient({ authKey: '...', bucketKey: '...' });
75
+ * const db = createClient({ authKey: 'ak_...', securityKey: 'sk_...' });
70
76
  */
71
77
  declare function createClient(config: HydrousConfig): HydrousClient;
72
78
 
package/dist/index.d.ts CHANGED
@@ -1,8 +1,9 @@
1
1
  import { RecordsClient } from './records/index.js';
2
+ export { BucketOptions } from './records/index.js';
2
3
  import { AuthClient } from './auth/index.js';
3
4
  import { AnalyticsClient } from './analytics/index.js';
4
- import { H as HydrousErrorBody, a as HydrousConfig } from './http-DbiqdKlw.js';
5
- export { A as AccountLockPayload, b as AccountLockResponse, c as AnalyticsQuery, d as AnalyticsQueryType, e as AnalyticsResponse, f as ApiMeta, g as AuthUser, B as BatchDeletePayload, h as BatchDeleteResponse, i as BatchInsertPayload, j as BatchInsertResponse, k as BatchResult, l as BatchUpdateItem, m as BatchUpdatePayload, n as BatchUpdateResponse, C as CountResult, D as DateRange, o as DeleteRecordResponse, p as DistributionItem, E as EmailVerifyConfirmPayload, q as EmailVerifyRequestPayload, F as FieldStatsResult, r as FieldTimeSeriesPoint, s as Filter, t as FilterOp, u as FilteredRecordsResult, G as GetRecordOptions, v as GetRecordResponse, w as GetSnapshotResponse, x as GetUserResponse, y as HistoryEntry, z as HydrousRecord, I as InsertRecordPayload, J as InsertRecordResponse, L as ListUsersResponse, M as MultiMetricItem, P as PaginationMeta, K as PasswordChangePayload, N as PasswordResetConfirmPayload, O as PasswordResetRequestPayload, Q as QueryOptions, R as QueryResponse, S as RecordData, T as RecordExistsInfo, U as RefreshSessionResponse, V as RequestOptions, W as SessionInfo, X as SignInPayload, Y as SignInResponse, Z as SignOutPayload, _ as SignUpPayload, $ as SignUpResponse, a0 as StorageStatsResult, a1 as SumResult, a2 as TimeSeriesPoint, a3 as TopNItem, a4 as UpdateRecordPayload, a5 as UpdateRecordResponse, a6 as UpdateUserPayload, a7 as UpdateUserResponse, a8 as ValidateSessionResponse } from './http-DbiqdKlw.js';
5
+ import { H as HydrousErrorBody, a as HydrousConfig } from './http-DTukpdAU.js';
6
+ export { A as AccountLockPayload, b as AccountLockResponse, c as AnalyticsQuery, d as AnalyticsQueryType, e as AnalyticsResponse, f as ApiMeta, g as AuthUser, B as BatchDeletePayload, h as BatchDeleteResponse, i as BatchInsertPayload, j as BatchInsertResponse, k as BatchResult, l as BatchUpdateItem, m as BatchUpdatePayload, n as BatchUpdateResponse, C as CountResult, D as DateRange, o as DeleteRecordResponse, p as DistributionItem, E as EmailVerifyConfirmPayload, q as EmailVerifyRequestPayload, F as FieldStatsResult, r as FieldTimeSeriesPoint, s as Filter, t as FilterOp, u as FilteredRecordsResult, G as GetRecordOptions, v as GetRecordResponse, w as GetSnapshotResponse, x as GetUserResponse, y as HistoryEntry, z as HydrousRecord, I as InsertRecordPayload, J as InsertRecordResponse, L as ListUsersResponse, M as MultiMetricItem, P as PaginationMeta, K as PasswordChangePayload, N as PasswordResetConfirmPayload, O as PasswordResetRequestPayload, Q as QueryOptions, R as QueryResponse, S as RecordData, T as RecordExistsInfo, U as RefreshSessionResponse, V as RequestOptions, W as SessionInfo, X as SignInPayload, Y as SignInResponse, Z as SignOutPayload, _ as SignUpPayload, $ as SignUpResponse, a0 as StorageStatsResult, a1 as SumResult, a2 as TimeSeriesPoint, a3 as TopNItem, a4 as UpdateRecordPayload, a5 as UpdateRecordResponse, a6 as UpdateUserPayload, a7 as UpdateUserResponse, a8 as ValidateSessionResponse } from './http-DTukpdAU.js';
6
7
 
7
8
  /**
8
9
  * Thrown for any non-2xx response from the HydrousDB API.
@@ -35,22 +36,27 @@ declare class HydrousTimeoutError extends Error {
35
36
  /**
36
37
  * The main entry point for the HydrousDB SDK.
37
38
  *
39
+ * Initialise once with your `authKey` and `securityKey`.
40
+ * Every records and analytics call then takes a `bucketKey` option
41
+ * so a single client instance can work across multiple buckets.
42
+ *
38
43
  * @example
39
44
  * import { createClient } from 'hydrousdb';
40
45
  *
41
46
  * const db = createClient({
42
- * authKey: 'your-auth-key',
43
- * bucketKey: 'your-bucket',
47
+ * authKey: 'ak_...', // for /auth routes
48
+ * securityKey: 'sk_...', // credential for records & analytics
44
49
  * });
45
50
  *
46
- * // Records
47
- * const { data } = await db.records.get('rec_abc123');
51
+ * // Records — pass bucketKey on every call
52
+ * const { data } = await db.records.get('rec_abc123', { bucketKey: 'users' });
53
+ * await db.records.insert({ values: { name: 'Alice' } }, { bucketKey: 'users' });
48
54
  *
49
- * // Auth
55
+ * // Auth — no bucketKey needed
50
56
  * const { data, session } = await db.auth.signIn({ email: 'a@b.com', password: '...' });
51
57
  *
52
- * // Analytics
53
- * const { data } = await db.analytics.count();
58
+ * // Analytics — pass bucketKey on every call
59
+ * const { data } = await db.analytics.count({ bucketKey: 'orders' });
54
60
  */
55
61
  declare class HydrousClient {
56
62
  /** Record CRUD and batch operations */
@@ -66,7 +72,7 @@ declare class HydrousClient {
66
72
  * Create a HydrousDB client.
67
73
  *
68
74
  * @example
69
- * const db = createClient({ authKey: '...', bucketKey: '...' });
75
+ * const db = createClient({ authKey: 'ak_...', securityKey: 'sk_...' });
70
76
  */
71
77
  declare function createClient(config: HydrousConfig): HydrousClient;
72
78