@clipin/convex-wearables 0.0.3 → 0.1.1

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.
@@ -0,0 +1,97 @@
1
+ import type { Doc } from "./_generated/dataModel";
2
+ export declare const DEFAULT_POLICY_SET_KEY = "__default__";
3
+ export declare const DEFAULT_MAINTENANCE_INTERVAL_MS: number;
4
+ export declare const DEFAULT_TIME_SERIES_AGGREGATIONS: readonly ["avg", "min", "max", "last", "count"];
5
+ export type DurationInput = string | number;
6
+ export type TimeSeriesAggregation = Doc<"timeSeriesPolicyRules">["tiers"][number] extends infer Tier ? Tier extends {
7
+ aggregations: infer Aggregations;
8
+ } ? Aggregations extends Array<infer Aggregation> ? Aggregation : never : never : never;
9
+ export type TimeSeriesTierInput = {
10
+ kind: "raw";
11
+ fromAge: DurationInput;
12
+ toAge: DurationInput | null;
13
+ } | {
14
+ kind: "rollup";
15
+ fromAge: DurationInput;
16
+ toAge: DurationInput | null;
17
+ bucket: DurationInput;
18
+ aggregations?: TimeSeriesAggregation[];
19
+ };
20
+ export type NormalizedTimeSeriesTier = Doc<"timeSeriesPolicyRules">["tiers"][number];
21
+ export type TimeSeriesPolicyRuleInput = {
22
+ provider?: Doc<"timeSeriesPolicyRules">["provider"];
23
+ seriesType?: string;
24
+ tiers: TimeSeriesTierInput[];
25
+ };
26
+ export declare function parseDurationInput(input: DurationInput, label: string): number;
27
+ export declare function createTimeSeriesPolicyScopeKey(provider?: string, seriesType?: string): string;
28
+ export declare function inferTimeSeriesPolicyScope(provider?: string, seriesType?: string): "provider" | "provider_series" | "series" | "global";
29
+ export declare function normalizeAggregations(aggregations?: readonly TimeSeriesAggregation[]): TimeSeriesAggregation[];
30
+ export declare function normalizeTimeSeriesTierInputs(tiers: TimeSeriesTierInput[]): ({
31
+ kind: "raw";
32
+ fromAgeMs: number;
33
+ toAgeMs: number | null;
34
+ bucketMs?: undefined;
35
+ aggregations?: undefined;
36
+ } | {
37
+ kind: "rollup";
38
+ fromAgeMs: number;
39
+ toAgeMs: number | null;
40
+ bucketMs: number;
41
+ aggregations: ("avg" | "min" | "max" | "last" | "count")[];
42
+ })[];
43
+ export declare function normalizeTimeSeriesPolicyRuleInputs(rules: TimeSeriesPolicyRuleInput[]): {
44
+ provider: "garmin" | "suunto" | "polar" | "whoop" | "strava" | "apple" | "samsung" | "google" | undefined;
45
+ seriesType: string | undefined;
46
+ tiers: ({
47
+ kind: "raw";
48
+ fromAgeMs: number;
49
+ toAgeMs: number | null;
50
+ bucketMs?: undefined;
51
+ aggregations?: undefined;
52
+ } | {
53
+ kind: "rollup";
54
+ fromAgeMs: number;
55
+ toAgeMs: number | null;
56
+ bucketMs: number;
57
+ aggregations: ("avg" | "min" | "max" | "last" | "count")[];
58
+ })[];
59
+ }[];
60
+ export declare function findTierForAge(tiers: NormalizedTimeSeriesTier[], ageMs: number): {
61
+ kind: "raw";
62
+ fromAgeMs: number;
63
+ toAgeMs: number | null;
64
+ } | {
65
+ kind: "rollup";
66
+ bucketMs: number;
67
+ fromAgeMs: number;
68
+ toAgeMs: number | null;
69
+ aggregations: ("avg" | "min" | "max" | "last" | "count")[];
70
+ } | null;
71
+ export declare function getRawTier(tiers: NormalizedTimeSeriesTier[]): {
72
+ kind: "raw";
73
+ fromAgeMs: number;
74
+ toAgeMs: number | null;
75
+ } | null;
76
+ export declare function getRollupTiers(tiers: NormalizedTimeSeriesTier[]): {
77
+ kind: "rollup";
78
+ bucketMs: number;
79
+ fromAgeMs: number;
80
+ toAgeMs: number | null;
81
+ aggregations: ("avg" | "min" | "max" | "last" | "count")[];
82
+ }[];
83
+ export declare function buildBuiltinFullTiers(): NormalizedTimeSeriesTier[];
84
+ export declare function resolveScopedPolicyRule<Rule extends {
85
+ provider?: string;
86
+ seriesType?: string;
87
+ }>(rules: Rule[], provider: string, seriesType: string): Rule | null;
88
+ export declare function comparePolicyScopes(a: {
89
+ provider?: string;
90
+ seriesType?: string;
91
+ }, b: {
92
+ provider?: string;
93
+ seriesType?: string;
94
+ }): number;
95
+ export declare function getBucketStart(recordedAt: number, bucketMs: number): number;
96
+ export declare function getBucketEnd(bucketStart: number, bucketMs: number): number;
97
+ //# sourceMappingURL=timeSeriesPolicyUtils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeSeriesPolicyUtils.d.ts","sourceRoot":"","sources":["../../src/component/timeSeriesPolicyUtils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,163 @@
1
+ export const DEFAULT_POLICY_SET_KEY = "__default__";
2
+ export const DEFAULT_MAINTENANCE_INTERVAL_MS = 60 * 60 * 1000;
3
+ export const DEFAULT_TIME_SERIES_AGGREGATIONS = ["avg", "min", "max", "last", "count"];
4
+ const DURATION_UNITS = {
5
+ ms: 1,
6
+ s: 1000,
7
+ m: 60 * 1000,
8
+ h: 60 * 60 * 1000,
9
+ d: 24 * 60 * 60 * 1000,
10
+ w: 7 * 24 * 60 * 60 * 1000,
11
+ };
12
+ export function parseDurationInput(input, label) {
13
+ if (typeof input === "number") {
14
+ if (!Number.isFinite(input) || input < 0) {
15
+ throw new Error(`${label} must be a non-negative duration`);
16
+ }
17
+ return Math.floor(input);
18
+ }
19
+ const trimmed = input.trim().toLowerCase();
20
+ const match = /^(\d+(?:\.\d+)?)\s*(ms|s|m|h|d|w)$/.exec(trimmed);
21
+ if (!match) {
22
+ throw new Error(`${label} must be a duration like "30m", "24h", "7d", or a numeric millisecond value`);
23
+ }
24
+ const value = Number(match[1]);
25
+ const unit = match[2];
26
+ return Math.floor(value * DURATION_UNITS[unit]);
27
+ }
28
+ export function createTimeSeriesPolicyScopeKey(provider, seriesType) {
29
+ return `${provider ?? "*"}::${seriesType ?? "*"}`;
30
+ }
31
+ export function inferTimeSeriesPolicyScope(provider, seriesType) {
32
+ if (provider && seriesType) {
33
+ return "provider_series";
34
+ }
35
+ if (seriesType) {
36
+ return "series";
37
+ }
38
+ if (provider) {
39
+ return "provider";
40
+ }
41
+ return "global";
42
+ }
43
+ export function normalizeAggregations(aggregations) {
44
+ const unique = new Set(aggregations ?? DEFAULT_TIME_SERIES_AGGREGATIONS);
45
+ if (unique.size === 0) {
46
+ throw new Error("Rollup tiers must include at least one aggregation");
47
+ }
48
+ return Array.from(unique);
49
+ }
50
+ export function normalizeTimeSeriesTierInputs(tiers) {
51
+ if (tiers.length === 0) {
52
+ throw new Error("A time-series policy rule must include at least one tier");
53
+ }
54
+ let rawTierCount = 0;
55
+ const normalized = tiers.map((tier, index) => {
56
+ const fromAgeMs = parseDurationInput(tier.fromAge, `tiers[${index}].fromAge`);
57
+ const toAgeMs = tier.toAge === null ? null : parseDurationInput(tier.toAge, `tiers[${index}].toAge`);
58
+ if (toAgeMs !== null && toAgeMs <= fromAgeMs) {
59
+ throw new Error(`tiers[${index}] must have toAge greater than fromAge`);
60
+ }
61
+ if (tier.kind === "raw") {
62
+ rawTierCount += 1;
63
+ return {
64
+ kind: "raw",
65
+ fromAgeMs,
66
+ toAgeMs,
67
+ };
68
+ }
69
+ const bucketMs = parseDurationInput(tier.bucket, `tiers[${index}].bucket`);
70
+ if (bucketMs <= 0 || bucketMs % (60 * 1000) !== 0) {
71
+ throw new Error(`tiers[${index}].bucket must be a positive whole-minute duration`);
72
+ }
73
+ return {
74
+ kind: "rollup",
75
+ fromAgeMs,
76
+ toAgeMs,
77
+ bucketMs,
78
+ aggregations: normalizeAggregations(tier.aggregations),
79
+ };
80
+ });
81
+ if (normalized[0].fromAgeMs !== 0) {
82
+ throw new Error("The first tier must start at age 0");
83
+ }
84
+ if (rawTierCount > 1) {
85
+ throw new Error("Only one raw tier is supported in a single policy rule");
86
+ }
87
+ for (let index = 0; index < normalized.length - 1; index += 1) {
88
+ const current = normalized[index];
89
+ const next = normalized[index + 1];
90
+ if (current.toAgeMs === null) {
91
+ throw new Error("Open-ended tiers must be the final tier");
92
+ }
93
+ if (next.fromAgeMs !== current.toAgeMs) {
94
+ throw new Error("Policy tiers must be contiguous without gaps or overlap");
95
+ }
96
+ }
97
+ return normalized;
98
+ }
99
+ export function normalizeTimeSeriesPolicyRuleInputs(rules) {
100
+ const seenScopes = new Set();
101
+ return rules.map((rule, index) => {
102
+ const scopeKey = createTimeSeriesPolicyScopeKey(rule.provider, rule.seriesType);
103
+ if (seenScopes.has(scopeKey)) {
104
+ throw new Error(`Duplicate time-series policy rule scope "${scopeKey}" at index ${index}`);
105
+ }
106
+ seenScopes.add(scopeKey);
107
+ return {
108
+ provider: rule.provider,
109
+ seriesType: rule.seriesType,
110
+ tiers: normalizeTimeSeriesTierInputs(rule.tiers),
111
+ };
112
+ });
113
+ }
114
+ export function findTierForAge(tiers, ageMs) {
115
+ return (tiers.find((tier) => ageMs >= tier.fromAgeMs && (tier.toAgeMs === null || ageMs < tier.toAgeMs)) ?? null);
116
+ }
117
+ export function getRawTier(tiers) {
118
+ return tiers.find((tier) => tier.kind === "raw") ?? null;
119
+ }
120
+ export function getRollupTiers(tiers) {
121
+ return tiers.filter((tier) => tier.kind === "rollup");
122
+ }
123
+ export function buildBuiltinFullTiers() {
124
+ return [
125
+ {
126
+ kind: "raw",
127
+ fromAgeMs: 0,
128
+ toAgeMs: null,
129
+ },
130
+ ];
131
+ }
132
+ export function resolveScopedPolicyRule(rules, provider, seriesType) {
133
+ return (rules.find((rule) => rule.provider === provider && rule.seriesType === seriesType) ??
134
+ rules.find((rule) => rule.provider === undefined && rule.seriesType === seriesType) ??
135
+ rules.find((rule) => rule.provider === provider && rule.seriesType === undefined) ??
136
+ rules.find((rule) => rule.provider === undefined && rule.seriesType === undefined) ??
137
+ null);
138
+ }
139
+ export function comparePolicyScopes(a, b) {
140
+ const weight = (item) => {
141
+ const scope = inferTimeSeriesPolicyScope(item.provider, item.seriesType);
142
+ switch (scope) {
143
+ case "global":
144
+ return 0;
145
+ case "provider":
146
+ return 1;
147
+ case "series":
148
+ return 2;
149
+ case "provider_series":
150
+ return 3;
151
+ }
152
+ };
153
+ return (weight(a) - weight(b) ||
154
+ (a.provider ?? "").localeCompare(b.provider ?? "") ||
155
+ (a.seriesType ?? "").localeCompare(b.seriesType ?? ""));
156
+ }
157
+ export function getBucketStart(recordedAt, bucketMs) {
158
+ return Math.floor(recordedAt / bucketMs) * bucketMs;
159
+ }
160
+ export function getBucketEnd(bucketStart, bucketMs) {
161
+ return bucketStart + bucketMs - 1;
162
+ }
163
+ //# sourceMappingURL=timeSeriesPolicyUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeSeriesPolicyUtils.js","sourceRoot":"","sources":["../../src/component/timeSeriesPolicyUtils.ts"],"names":[],"mappings":"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"}
package/dist/test.d.ts CHANGED
@@ -76,6 +76,38 @@ declare const _default: {
76
76
  by_source_type_time: ["dataSourceId", "seriesType", "recordedAt", "_creationTime"];
77
77
  by_type_time: ["seriesType", "recordedAt", "_creationTime"];
78
78
  }, {}, {}>;
79
+ timeSeriesRollups: import("convex/server").TableDefinition<import("convex/values").VObject<{
80
+ avg: number;
81
+ min: number;
82
+ max: number;
83
+ last: number;
84
+ count: number;
85
+ dataSourceId: import("convex/values").GenericId<"dataSources">;
86
+ seriesType: string;
87
+ bucketMs: number;
88
+ bucketStart: number;
89
+ bucketEnd: number;
90
+ lastRecordedAt: number;
91
+ updatedAt: number;
92
+ }, {
93
+ dataSourceId: import("convex/values").VId<import("convex/values").GenericId<"dataSources">, "required">;
94
+ seriesType: import("convex/values").VString<string, "required">;
95
+ bucketMs: import("convex/values").VFloat64<number, "required">;
96
+ bucketStart: import("convex/values").VFloat64<number, "required">;
97
+ bucketEnd: import("convex/values").VFloat64<number, "required">;
98
+ avg: import("convex/values").VFloat64<number, "required">;
99
+ min: import("convex/values").VFloat64<number, "required">;
100
+ max: import("convex/values").VFloat64<number, "required">;
101
+ last: import("convex/values").VFloat64<number, "required">;
102
+ lastRecordedAt: import("convex/values").VFloat64<number, "required">;
103
+ count: import("convex/values").VFloat64<number, "required">;
104
+ updatedAt: import("convex/values").VFloat64<number, "required">;
105
+ }, "required", "avg" | "min" | "max" | "last" | "count" | "dataSourceId" | "seriesType" | "bucketMs" | "bucketStart" | "bucketEnd" | "lastRecordedAt" | "updatedAt">, {
106
+ by_source_type_bucket: ["dataSourceId", "seriesType", "bucketStart", "_creationTime"];
107
+ by_source_type_bucket_size: ["dataSourceId", "seriesType", "bucketMs", "bucketStart", "_creationTime"];
108
+ by_source_bucket: ["dataSourceId", "bucketStart", "_creationTime"];
109
+ by_type_bucket: ["seriesType", "bucketStart", "_creationTime"];
110
+ }, {}, {}>;
79
111
  events: import("convex/server").TableDefinition<import("convex/values").VObject<{
80
112
  type?: string | undefined;
81
113
  externalId?: string | undefined;
@@ -297,10 +329,10 @@ declare const _default: {
297
329
  by_state: ["state", "_creationTime"];
298
330
  }, {}, {}>;
299
331
  providerSettings: import("convex/server").TableDefinition<import("convex/values").VObject<{
332
+ updatedAt?: number | undefined;
300
333
  clientId?: string | undefined;
301
334
  clientSecret?: string | undefined;
302
335
  subscriptionKey?: string | undefined;
303
- updatedAt?: number | undefined;
304
336
  provider: "garmin" | "suunto" | "polar" | "whoop" | "strava" | "apple" | "samsung" | "google";
305
337
  isEnabled: boolean;
306
338
  }, {
@@ -310,9 +342,137 @@ declare const _default: {
310
342
  clientSecret: import("convex/values").VString<string | undefined, "optional">;
311
343
  subscriptionKey: import("convex/values").VString<string | undefined, "optional">;
312
344
  updatedAt: import("convex/values").VFloat64<number | undefined, "optional">;
313
- }, "required", "provider" | "isEnabled" | "clientId" | "clientSecret" | "subscriptionKey" | "updatedAt">, {
345
+ }, "required", "provider" | "updatedAt" | "isEnabled" | "clientId" | "clientSecret" | "subscriptionKey">, {
314
346
  by_provider: ["provider", "_creationTime"];
315
347
  }, {}, {}>;
348
+ timeSeriesPolicyRules: import("convex/server").TableDefinition<import("convex/values").VObject<{
349
+ provider?: "garmin" | "suunto" | "polar" | "whoop" | "strava" | "apple" | "samsung" | "google" | undefined;
350
+ seriesType?: string | undefined;
351
+ updatedAt: number;
352
+ policySetKind: "default" | "preset";
353
+ policySetKey: string;
354
+ scopeKey: string;
355
+ tiers: ({
356
+ kind: "raw";
357
+ fromAgeMs: number;
358
+ toAgeMs: number | null;
359
+ } | {
360
+ kind: "rollup";
361
+ bucketMs: number;
362
+ fromAgeMs: number;
363
+ toAgeMs: number | null;
364
+ aggregations: ("avg" | "min" | "max" | "last" | "count")[];
365
+ })[];
366
+ }, {
367
+ policySetKind: import("convex/values").VUnion<"default" | "preset", [import("convex/values").VLiteral<"default", "required">, import("convex/values").VLiteral<"preset", "required">], "required", never>;
368
+ policySetKey: import("convex/values").VString<string, "required">;
369
+ scopeKey: import("convex/values").VString<string, "required">;
370
+ provider: import("convex/values").VUnion<"garmin" | "suunto" | "polar" | "whoop" | "strava" | "apple" | "samsung" | "google" | undefined, [import("convex/values").VLiteral<"garmin", "required">, import("convex/values").VLiteral<"suunto", "required">, import("convex/values").VLiteral<"polar", "required">, import("convex/values").VLiteral<"whoop", "required">, import("convex/values").VLiteral<"strava", "required">, import("convex/values").VLiteral<"apple", "required">, import("convex/values").VLiteral<"samsung", "required">, import("convex/values").VLiteral<"google", "required">], "optional", never>;
371
+ seriesType: import("convex/values").VString<string | undefined, "optional">;
372
+ tiers: import("convex/values").VArray<({
373
+ kind: "raw";
374
+ fromAgeMs: number;
375
+ toAgeMs: number | null;
376
+ } | {
377
+ kind: "rollup";
378
+ bucketMs: number;
379
+ fromAgeMs: number;
380
+ toAgeMs: number | null;
381
+ aggregations: ("avg" | "min" | "max" | "last" | "count")[];
382
+ })[], import("convex/values").VUnion<{
383
+ kind: "raw";
384
+ fromAgeMs: number;
385
+ toAgeMs: number | null;
386
+ } | {
387
+ kind: "rollup";
388
+ bucketMs: number;
389
+ fromAgeMs: number;
390
+ toAgeMs: number | null;
391
+ aggregations: ("avg" | "min" | "max" | "last" | "count")[];
392
+ }, [import("convex/values").VObject<{
393
+ kind: "raw";
394
+ fromAgeMs: number;
395
+ toAgeMs: number | null;
396
+ }, {
397
+ kind: import("convex/values").VLiteral<"raw", "required">;
398
+ fromAgeMs: import("convex/values").VFloat64<number, "required">;
399
+ toAgeMs: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
400
+ }, "required", "kind" | "fromAgeMs" | "toAgeMs">, import("convex/values").VObject<{
401
+ kind: "rollup";
402
+ bucketMs: number;
403
+ fromAgeMs: number;
404
+ toAgeMs: number | null;
405
+ aggregations: ("avg" | "min" | "max" | "last" | "count")[];
406
+ }, {
407
+ kind: import("convex/values").VLiteral<"rollup", "required">;
408
+ fromAgeMs: import("convex/values").VFloat64<number, "required">;
409
+ toAgeMs: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
410
+ bucketMs: import("convex/values").VFloat64<number, "required">;
411
+ aggregations: import("convex/values").VArray<("avg" | "min" | "max" | "last" | "count")[], import("convex/values").VUnion<"avg" | "min" | "max" | "last" | "count", [import("convex/values").VLiteral<"avg", "required">, import("convex/values").VLiteral<"min", "required">, import("convex/values").VLiteral<"max", "required">, import("convex/values").VLiteral<"last", "required">, import("convex/values").VLiteral<"count", "required">], "required", never>, "required">;
412
+ }, "required", "kind" | "bucketMs" | "fromAgeMs" | "toAgeMs" | "aggregations">], "required", "kind" | "bucketMs" | "fromAgeMs" | "toAgeMs" | "aggregations">, "required">;
413
+ updatedAt: import("convex/values").VFloat64<number, "required">;
414
+ }, "required", "provider" | "seriesType" | "updatedAt" | "policySetKind" | "policySetKey" | "scopeKey" | "tiers">, {
415
+ by_set: ["policySetKind", "policySetKey", "_creationTime"];
416
+ by_set_scope: ["policySetKind", "policySetKey", "provider", "seriesType", "_creationTime"];
417
+ }, {}, {}>;
418
+ timeSeriesPolicyAssignments: import("convex/server").TableDefinition<import("convex/values").VObject<{
419
+ userId: string;
420
+ updatedAt: number;
421
+ presetKey: string;
422
+ }, {
423
+ userId: import("convex/values").VString<string, "required">;
424
+ presetKey: import("convex/values").VString<string, "required">;
425
+ updatedAt: import("convex/values").VFloat64<number, "required">;
426
+ }, "required", "userId" | "updatedAt" | "presetKey">, {
427
+ by_user: ["userId", "_creationTime"];
428
+ by_preset: ["presetKey", "_creationTime"];
429
+ }, {}, {}>;
430
+ timeSeriesPolicySettings: import("convex/server").TableDefinition<import("convex/values").VObject<{
431
+ scheduledAt?: number | undefined;
432
+ lastRunAt?: number | undefined;
433
+ lastError?: string | undefined;
434
+ updatedAt: number;
435
+ key: string;
436
+ maintenanceEnabled: boolean;
437
+ maintenanceIntervalMs: number;
438
+ }, {
439
+ key: import("convex/values").VString<string, "required">;
440
+ maintenanceEnabled: import("convex/values").VBoolean<boolean, "required">;
441
+ maintenanceIntervalMs: import("convex/values").VFloat64<number, "required">;
442
+ scheduledAt: import("convex/values").VFloat64<number | undefined, "optional">;
443
+ lastRunAt: import("convex/values").VFloat64<number | undefined, "optional">;
444
+ lastError: import("convex/values").VString<string | undefined, "optional">;
445
+ updatedAt: import("convex/values").VFloat64<number, "required">;
446
+ }, "required", "updatedAt" | "key" | "maintenanceEnabled" | "maintenanceIntervalMs" | "scheduledAt" | "lastRunAt" | "lastError">, {
447
+ by_key: ["key", "_creationTime"];
448
+ }, {}, {}>;
449
+ timeSeriesSeriesState: import("convex/server").TableDefinition<import("convex/values").VObject<{
450
+ connectionId?: import("convex/values").GenericId<"connections"> | undefined;
451
+ lastMaintenanceAt?: number | undefined;
452
+ provider: "garmin" | "suunto" | "polar" | "whoop" | "strava" | "apple" | "samsung" | "google";
453
+ userId: string;
454
+ dataSourceId: import("convex/values").GenericId<"dataSources">;
455
+ seriesType: string;
456
+ updatedAt: number;
457
+ latestRecordedAt: number;
458
+ lastIngestedAt: number;
459
+ nextMaintenanceAt: number;
460
+ }, {
461
+ dataSourceId: import("convex/values").VId<import("convex/values").GenericId<"dataSources">, "required">;
462
+ connectionId: import("convex/values").VId<import("convex/values").GenericId<"connections"> | undefined, "optional">;
463
+ userId: import("convex/values").VString<string, "required">;
464
+ provider: import("convex/values").VUnion<"garmin" | "suunto" | "polar" | "whoop" | "strava" | "apple" | "samsung" | "google", [import("convex/values").VLiteral<"garmin", "required">, import("convex/values").VLiteral<"suunto", "required">, import("convex/values").VLiteral<"polar", "required">, import("convex/values").VLiteral<"whoop", "required">, import("convex/values").VLiteral<"strava", "required">, import("convex/values").VLiteral<"apple", "required">, import("convex/values").VLiteral<"samsung", "required">, import("convex/values").VLiteral<"google", "required">], "required", never>;
465
+ seriesType: import("convex/values").VString<string, "required">;
466
+ latestRecordedAt: import("convex/values").VFloat64<number, "required">;
467
+ lastIngestedAt: import("convex/values").VFloat64<number, "required">;
468
+ nextMaintenanceAt: import("convex/values").VFloat64<number, "required">;
469
+ lastMaintenanceAt: import("convex/values").VFloat64<number | undefined, "optional">;
470
+ updatedAt: import("convex/values").VFloat64<number, "required">;
471
+ }, "required", "provider" | "userId" | "connectionId" | "dataSourceId" | "seriesType" | "updatedAt" | "latestRecordedAt" | "lastIngestedAt" | "nextMaintenanceAt" | "lastMaintenanceAt">, {
472
+ by_source_series: ["dataSourceId", "seriesType", "_creationTime"];
473
+ by_next_maintenance: ["nextMaintenanceAt", "_creationTime"];
474
+ by_user: ["userId", "_creationTime"];
475
+ }, {}, {}>;
316
476
  providerPriorities: import("convex/server").TableDefinition<import("convex/values").VObject<{
317
477
  provider: "garmin" | "suunto" | "polar" | "whoop" | "strava" | "apple" | "samsung" | "google";
318
478
  priority: number;
@@ -1 +1 @@
1
- {"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../src/test.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACrE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAK9C;;;;GAIG;AACH,wBAAgB,QAAQ,CACtB,CAAC,EAAE,UAAU,CAAC,gBAAgB,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC,EACvD,IAAI,GAAE,MAAoB,QAK3B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAED,wBAA6C"}
1
+ {"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../src/test.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACrE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAK9C;;;;GAIG;AACH,wBAAgB,QAAQ,CACtB,CAAC,EAAE,UAAU,CAAC,gBAAgB,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC,EACvD,IAAI,GAAE,MAAoB,QAK3B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAED,wBAA6C"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@clipin/convex-wearables",
3
- "version": "0.0.3",
3
+ "version": "0.1.1",
4
4
  "description": "Convex component for wearable device integrations — sync health data from Garmin, Strava, Whoop, Polar, Suunto, Apple HealthKit, Samsung Health, and Google Health Connect.",
5
5
  "license": "Apache-2.0",
6
6
  "homepage": "https://github.com/clipinfit/convex-wearables#readme",