@zykeco/sync-server 0.3.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.
Files changed (58) hide show
  1. package/dist/db/client.d.ts +5 -0
  2. package/dist/db/client.js +8 -0
  3. package/dist/db/client.js.map +1 -0
  4. package/dist/db/migrate.d.ts +2 -0
  5. package/dist/db/migrate.js +9 -0
  6. package/dist/db/migrate.js.map +1 -0
  7. package/dist/db/schema.d.ts +433 -0
  8. package/dist/db/schema.js +38 -0
  9. package/dist/db/schema.js.map +1 -0
  10. package/dist/env.d.ts +8 -0
  11. package/dist/env.js +16 -0
  12. package/dist/env.js.map +1 -0
  13. package/dist/index.d.ts +1 -0
  14. package/dist/index.js +34 -0
  15. package/dist/index.js.map +1 -0
  16. package/dist/migrate-cli.d.ts +2 -0
  17. package/dist/migrate-cli.js +9 -0
  18. package/dist/migrate-cli.js.map +1 -0
  19. package/dist/routes/auth.d.ts +6 -0
  20. package/dist/routes/auth.js +20 -0
  21. package/dist/routes/auth.js.map +1 -0
  22. package/dist/routes/daily-metrics.d.ts +3 -0
  23. package/dist/routes/daily-metrics.js +24 -0
  24. package/dist/routes/daily-metrics.js.map +1 -0
  25. package/dist/routes/health.d.ts +3 -0
  26. package/dist/routes/health.js +16 -0
  27. package/dist/routes/health.js.map +1 -0
  28. package/dist/routes/sleep-sessions.d.ts +3 -0
  29. package/dist/routes/sleep-sessions.js +24 -0
  30. package/dist/routes/sleep-sessions.js.map +1 -0
  31. package/dist/routes/validate.d.ts +3 -0
  32. package/dist/routes/validate.js +17 -0
  33. package/dist/routes/validate.js.map +1 -0
  34. package/dist/routes/weekly-metrics.d.ts +3 -0
  35. package/dist/routes/weekly-metrics.js +24 -0
  36. package/dist/routes/weekly-metrics.js.map +1 -0
  37. package/dist/routes/wipe.d.ts +7 -0
  38. package/dist/routes/wipe.js +23 -0
  39. package/dist/routes/wipe.js.map +1 -0
  40. package/dist/startup-cli.d.ts +2 -0
  41. package/dist/startup-cli.js +57 -0
  42. package/dist/startup-cli.js.map +1 -0
  43. package/dist/stores/daily-metrics.d.ts +3 -0
  44. package/dist/stores/daily-metrics.js +45 -0
  45. package/dist/stores/daily-metrics.js.map +1 -0
  46. package/dist/stores/sleep-sessions.d.ts +3 -0
  47. package/dist/stores/sleep-sessions.js +42 -0
  48. package/dist/stores/sleep-sessions.js.map +1 -0
  49. package/dist/stores/weekly-metrics.d.ts +3 -0
  50. package/dist/stores/weekly-metrics.js +44 -0
  51. package/dist/stores/weekly-metrics.js.map +1 -0
  52. package/dist/upgrade-cli.d.ts +2 -0
  53. package/dist/upgrade-cli.js +23 -0
  54. package/dist/upgrade-cli.js.map +1 -0
  55. package/drizzle/0000_parallel_juggernaut.sql +37 -0
  56. package/drizzle/meta/0000_snapshot.json +238 -0
  57. package/drizzle/meta/_journal.json +13 -0
  58. package/package.json +67 -0
@@ -0,0 +1,5 @@
1
+ import * as schema from './schema.js';
2
+ export type Db = ReturnType<typeof createDb>;
3
+ export declare function createDb(databaseUrl: string): import("drizzle-orm/libsql").LibSQLDatabase<typeof schema> & {
4
+ $client: import("@libsql/client").Client;
5
+ };
@@ -0,0 +1,8 @@
1
+ import { createClient } from '@libsql/client';
2
+ import { drizzle } from 'drizzle-orm/libsql';
3
+ import * as schema from './schema.js';
4
+ export function createDb(databaseUrl) {
5
+ const client = createClient({ url: databaseUrl });
6
+ return drizzle(client, { schema });
7
+ }
8
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/db/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AAItC,MAAM,UAAU,QAAQ,CAAC,WAAmB;IAC1C,MAAM,MAAM,GAAG,YAAY,CAAC,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC,CAAC;IAClD,OAAO,OAAO,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;AACrC,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { Db } from './client.js';
2
+ export declare function runMigrations(db: Db): Promise<void>;
@@ -0,0 +1,9 @@
1
+ import { fileURLToPath } from 'node:url';
2
+ import path from 'node:path';
3
+ import { migrate } from 'drizzle-orm/libsql/migrator';
4
+ const here = path.dirname(fileURLToPath(import.meta.url));
5
+ const MIGRATIONS_FOLDER = path.resolve(here, '../../drizzle');
6
+ export async function runMigrations(db) {
7
+ await migrate(db, { migrationsFolder: MIGRATIONS_FOLDER });
8
+ }
9
+ //# sourceMappingURL=migrate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/db/migrate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AAItD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,MAAM,iBAAiB,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;AAE9D,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,EAAM;IACxC,MAAM,OAAO,CAAC,EAAE,EAAE,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,CAAC,CAAC;AAC7D,CAAC"}
@@ -0,0 +1,433 @@
1
+ export declare const blobs: import("drizzle-orm/sqlite-core").SQLiteTableWithColumns<{
2
+ name: "blobs";
3
+ schema: undefined;
4
+ columns: {
5
+ id: import("drizzle-orm/sqlite-core").SQLiteColumn<{
6
+ name: "id";
7
+ tableName: "blobs";
8
+ dataType: "string";
9
+ columnType: "SQLiteText";
10
+ data: string;
11
+ driverParam: string;
12
+ notNull: true;
13
+ hasDefault: false;
14
+ isPrimaryKey: true;
15
+ isAutoincrement: false;
16
+ hasRuntimeDefault: false;
17
+ enumValues: [string, ...string[]];
18
+ baseColumn: never;
19
+ identity: undefined;
20
+ generated: undefined;
21
+ }, {}, {
22
+ length: number | undefined;
23
+ }>;
24
+ contentType: import("drizzle-orm/sqlite-core").SQLiteColumn<{
25
+ name: "content_type";
26
+ tableName: "blobs";
27
+ dataType: "string";
28
+ columnType: "SQLiteText";
29
+ data: string;
30
+ driverParam: string;
31
+ notNull: true;
32
+ hasDefault: false;
33
+ isPrimaryKey: false;
34
+ isAutoincrement: false;
35
+ hasRuntimeDefault: false;
36
+ enumValues: [string, ...string[]];
37
+ baseColumn: never;
38
+ identity: undefined;
39
+ generated: undefined;
40
+ }, {}, {
41
+ length: number | undefined;
42
+ }>;
43
+ size: import("drizzle-orm/sqlite-core").SQLiteColumn<{
44
+ name: "size";
45
+ tableName: "blobs";
46
+ dataType: "number";
47
+ columnType: "SQLiteInteger";
48
+ data: number;
49
+ driverParam: number;
50
+ notNull: true;
51
+ hasDefault: false;
52
+ isPrimaryKey: false;
53
+ isAutoincrement: false;
54
+ hasRuntimeDefault: false;
55
+ enumValues: undefined;
56
+ baseColumn: never;
57
+ identity: undefined;
58
+ generated: undefined;
59
+ }, {}, {}>;
60
+ bytes: import("drizzle-orm/sqlite-core").SQLiteColumn<{
61
+ name: "bytes";
62
+ tableName: "blobs";
63
+ dataType: "buffer";
64
+ columnType: "SQLiteBlobBuffer";
65
+ data: Buffer<ArrayBufferLike>;
66
+ driverParam: Buffer<ArrayBufferLike>;
67
+ notNull: true;
68
+ hasDefault: false;
69
+ isPrimaryKey: false;
70
+ isAutoincrement: false;
71
+ hasRuntimeDefault: false;
72
+ enumValues: undefined;
73
+ baseColumn: never;
74
+ identity: undefined;
75
+ generated: undefined;
76
+ }, {}, {}>;
77
+ createdAt: import("drizzle-orm/sqlite-core").SQLiteColumn<{
78
+ name: "created_at";
79
+ tableName: "blobs";
80
+ dataType: "number";
81
+ columnType: "SQLiteInteger";
82
+ data: number;
83
+ driverParam: number;
84
+ notNull: true;
85
+ hasDefault: false;
86
+ isPrimaryKey: false;
87
+ isAutoincrement: false;
88
+ hasRuntimeDefault: false;
89
+ enumValues: undefined;
90
+ baseColumn: never;
91
+ identity: undefined;
92
+ generated: undefined;
93
+ }, {}, {}>;
94
+ updatedAt: import("drizzle-orm/sqlite-core").SQLiteColumn<{
95
+ name: "updated_at";
96
+ tableName: "blobs";
97
+ dataType: "number";
98
+ columnType: "SQLiteInteger";
99
+ data: number;
100
+ driverParam: number;
101
+ notNull: true;
102
+ hasDefault: false;
103
+ isPrimaryKey: false;
104
+ isAutoincrement: false;
105
+ hasRuntimeDefault: false;
106
+ enumValues: undefined;
107
+ baseColumn: never;
108
+ identity: undefined;
109
+ generated: undefined;
110
+ }, {}, {}>;
111
+ };
112
+ dialect: "sqlite";
113
+ }>;
114
+ export declare const dailyMetrics: import("drizzle-orm/sqlite-core").SQLiteTableWithColumns<{
115
+ name: "daily_metrics";
116
+ schema: undefined;
117
+ columns: {
118
+ id: import("drizzle-orm/sqlite-core").SQLiteColumn<{
119
+ name: "id";
120
+ tableName: "daily_metrics";
121
+ dataType: "number";
122
+ columnType: "SQLiteInteger";
123
+ data: number;
124
+ driverParam: number;
125
+ notNull: true;
126
+ hasDefault: true;
127
+ isPrimaryKey: true;
128
+ isAutoincrement: false;
129
+ hasRuntimeDefault: false;
130
+ enumValues: undefined;
131
+ baseColumn: never;
132
+ identity: undefined;
133
+ generated: undefined;
134
+ }, {}, {}>;
135
+ isoDate: import("drizzle-orm/sqlite-core").SQLiteColumn<{
136
+ name: "iso_date";
137
+ tableName: "daily_metrics";
138
+ dataType: "string";
139
+ columnType: "SQLiteText";
140
+ data: string;
141
+ driverParam: string;
142
+ notNull: true;
143
+ hasDefault: false;
144
+ isPrimaryKey: false;
145
+ isAutoincrement: false;
146
+ hasRuntimeDefault: false;
147
+ enumValues: [string, ...string[]];
148
+ baseColumn: never;
149
+ identity: undefined;
150
+ generated: undefined;
151
+ }, {}, {
152
+ length: number | undefined;
153
+ }>;
154
+ metricKey: import("drizzle-orm/sqlite-core").SQLiteColumn<{
155
+ name: "metric_key";
156
+ tableName: "daily_metrics";
157
+ dataType: "string";
158
+ columnType: "SQLiteText";
159
+ data: string;
160
+ driverParam: string;
161
+ notNull: true;
162
+ hasDefault: false;
163
+ isPrimaryKey: false;
164
+ isAutoincrement: false;
165
+ hasRuntimeDefault: false;
166
+ enumValues: [string, ...string[]];
167
+ baseColumn: never;
168
+ identity: undefined;
169
+ generated: undefined;
170
+ }, {}, {
171
+ length: number | undefined;
172
+ }>;
173
+ value: import("drizzle-orm/sqlite-core").SQLiteColumn<{
174
+ name: "value";
175
+ tableName: "daily_metrics";
176
+ dataType: "number";
177
+ columnType: "SQLiteReal";
178
+ data: number;
179
+ driverParam: number;
180
+ notNull: true;
181
+ hasDefault: false;
182
+ isPrimaryKey: false;
183
+ isAutoincrement: false;
184
+ hasRuntimeDefault: false;
185
+ enumValues: undefined;
186
+ baseColumn: never;
187
+ identity: undefined;
188
+ generated: undefined;
189
+ }, {}, {}>;
190
+ createdAt: import("drizzle-orm/sqlite-core").SQLiteColumn<{
191
+ name: "created_at";
192
+ tableName: "daily_metrics";
193
+ dataType: "number";
194
+ columnType: "SQLiteInteger";
195
+ data: number;
196
+ driverParam: number;
197
+ notNull: true;
198
+ hasDefault: false;
199
+ isPrimaryKey: false;
200
+ isAutoincrement: false;
201
+ hasRuntimeDefault: false;
202
+ enumValues: undefined;
203
+ baseColumn: never;
204
+ identity: undefined;
205
+ generated: undefined;
206
+ }, {}, {}>;
207
+ updatedAt: import("drizzle-orm/sqlite-core").SQLiteColumn<{
208
+ name: "updated_at";
209
+ tableName: "daily_metrics";
210
+ dataType: "number";
211
+ columnType: "SQLiteInteger";
212
+ data: number;
213
+ driverParam: number;
214
+ notNull: true;
215
+ hasDefault: false;
216
+ isPrimaryKey: false;
217
+ isAutoincrement: false;
218
+ hasRuntimeDefault: false;
219
+ enumValues: undefined;
220
+ baseColumn: never;
221
+ identity: undefined;
222
+ generated: undefined;
223
+ }, {}, {}>;
224
+ };
225
+ dialect: "sqlite";
226
+ }>;
227
+ export declare const weeklyMetrics: import("drizzle-orm/sqlite-core").SQLiteTableWithColumns<{
228
+ name: "weekly_metrics";
229
+ schema: undefined;
230
+ columns: {
231
+ id: import("drizzle-orm/sqlite-core").SQLiteColumn<{
232
+ name: "id";
233
+ tableName: "weekly_metrics";
234
+ dataType: "number";
235
+ columnType: "SQLiteInteger";
236
+ data: number;
237
+ driverParam: number;
238
+ notNull: true;
239
+ hasDefault: true;
240
+ isPrimaryKey: true;
241
+ isAutoincrement: false;
242
+ hasRuntimeDefault: false;
243
+ enumValues: undefined;
244
+ baseColumn: never;
245
+ identity: undefined;
246
+ generated: undefined;
247
+ }, {}, {}>;
248
+ weekStartIsoDate: import("drizzle-orm/sqlite-core").SQLiteColumn<{
249
+ name: "week_start_iso_date";
250
+ tableName: "weekly_metrics";
251
+ dataType: "string";
252
+ columnType: "SQLiteText";
253
+ data: string;
254
+ driverParam: string;
255
+ notNull: true;
256
+ hasDefault: false;
257
+ isPrimaryKey: false;
258
+ isAutoincrement: false;
259
+ hasRuntimeDefault: false;
260
+ enumValues: [string, ...string[]];
261
+ baseColumn: never;
262
+ identity: undefined;
263
+ generated: undefined;
264
+ }, {}, {
265
+ length: number | undefined;
266
+ }>;
267
+ metricKey: import("drizzle-orm/sqlite-core").SQLiteColumn<{
268
+ name: "metric_key";
269
+ tableName: "weekly_metrics";
270
+ dataType: "string";
271
+ columnType: "SQLiteText";
272
+ data: string;
273
+ driverParam: string;
274
+ notNull: true;
275
+ hasDefault: false;
276
+ isPrimaryKey: false;
277
+ isAutoincrement: false;
278
+ hasRuntimeDefault: false;
279
+ enumValues: [string, ...string[]];
280
+ baseColumn: never;
281
+ identity: undefined;
282
+ generated: undefined;
283
+ }, {}, {
284
+ length: number | undefined;
285
+ }>;
286
+ value: import("drizzle-orm/sqlite-core").SQLiteColumn<{
287
+ name: "value";
288
+ tableName: "weekly_metrics";
289
+ dataType: "number";
290
+ columnType: "SQLiteReal";
291
+ data: number;
292
+ driverParam: number;
293
+ notNull: true;
294
+ hasDefault: false;
295
+ isPrimaryKey: false;
296
+ isAutoincrement: false;
297
+ hasRuntimeDefault: false;
298
+ enumValues: undefined;
299
+ baseColumn: never;
300
+ identity: undefined;
301
+ generated: undefined;
302
+ }, {}, {}>;
303
+ createdAt: import("drizzle-orm/sqlite-core").SQLiteColumn<{
304
+ name: "created_at";
305
+ tableName: "weekly_metrics";
306
+ dataType: "number";
307
+ columnType: "SQLiteInteger";
308
+ data: number;
309
+ driverParam: number;
310
+ notNull: true;
311
+ hasDefault: false;
312
+ isPrimaryKey: false;
313
+ isAutoincrement: false;
314
+ hasRuntimeDefault: false;
315
+ enumValues: undefined;
316
+ baseColumn: never;
317
+ identity: undefined;
318
+ generated: undefined;
319
+ }, {}, {}>;
320
+ updatedAt: import("drizzle-orm/sqlite-core").SQLiteColumn<{
321
+ name: "updated_at";
322
+ tableName: "weekly_metrics";
323
+ dataType: "number";
324
+ columnType: "SQLiteInteger";
325
+ data: number;
326
+ driverParam: number;
327
+ notNull: true;
328
+ hasDefault: false;
329
+ isPrimaryKey: false;
330
+ isAutoincrement: false;
331
+ hasRuntimeDefault: false;
332
+ enumValues: undefined;
333
+ baseColumn: never;
334
+ identity: undefined;
335
+ generated: undefined;
336
+ }, {}, {}>;
337
+ };
338
+ dialect: "sqlite";
339
+ }>;
340
+ export declare const sleepSessions: import("drizzle-orm/sqlite-core").SQLiteTableWithColumns<{
341
+ name: "sleep_sessions";
342
+ schema: undefined;
343
+ columns: {
344
+ id: import("drizzle-orm/sqlite-core").SQLiteColumn<{
345
+ name: "id";
346
+ tableName: "sleep_sessions";
347
+ dataType: "number";
348
+ columnType: "SQLiteInteger";
349
+ data: number;
350
+ driverParam: number;
351
+ notNull: true;
352
+ hasDefault: true;
353
+ isPrimaryKey: true;
354
+ isAutoincrement: false;
355
+ hasRuntimeDefault: false;
356
+ enumValues: undefined;
357
+ baseColumn: never;
358
+ identity: undefined;
359
+ generated: undefined;
360
+ }, {}, {}>;
361
+ isoDate: import("drizzle-orm/sqlite-core").SQLiteColumn<{
362
+ name: "iso_date";
363
+ tableName: "sleep_sessions";
364
+ dataType: "string";
365
+ columnType: "SQLiteText";
366
+ data: string;
367
+ driverParam: string;
368
+ notNull: true;
369
+ hasDefault: false;
370
+ isPrimaryKey: false;
371
+ isAutoincrement: false;
372
+ hasRuntimeDefault: false;
373
+ enumValues: [string, ...string[]];
374
+ baseColumn: never;
375
+ identity: undefined;
376
+ generated: undefined;
377
+ }, {}, {
378
+ length: number | undefined;
379
+ }>;
380
+ updatedAt: import("drizzle-orm/sqlite-core").SQLiteColumn<{
381
+ name: "updated_at";
382
+ tableName: "sleep_sessions";
383
+ dataType: "number";
384
+ columnType: "SQLiteInteger";
385
+ data: number;
386
+ driverParam: number;
387
+ notNull: true;
388
+ hasDefault: false;
389
+ isPrimaryKey: false;
390
+ isAutoincrement: false;
391
+ hasRuntimeDefault: false;
392
+ enumValues: undefined;
393
+ baseColumn: never;
394
+ identity: undefined;
395
+ generated: undefined;
396
+ }, {}, {}>;
397
+ payloadVersion: import("drizzle-orm/sqlite-core").SQLiteColumn<{
398
+ name: "payload_version";
399
+ tableName: "sleep_sessions";
400
+ dataType: "number";
401
+ columnType: "SQLiteInteger";
402
+ data: number;
403
+ driverParam: number;
404
+ notNull: true;
405
+ hasDefault: true;
406
+ isPrimaryKey: false;
407
+ isAutoincrement: false;
408
+ hasRuntimeDefault: false;
409
+ enumValues: undefined;
410
+ baseColumn: never;
411
+ identity: undefined;
412
+ generated: undefined;
413
+ }, {}, {}>;
414
+ payload: import("drizzle-orm/sqlite-core").SQLiteColumn<{
415
+ name: "payload";
416
+ tableName: "sleep_sessions";
417
+ dataType: "json";
418
+ columnType: "SQLiteTextJson";
419
+ data: unknown;
420
+ driverParam: string;
421
+ notNull: true;
422
+ hasDefault: false;
423
+ isPrimaryKey: false;
424
+ isAutoincrement: false;
425
+ hasRuntimeDefault: false;
426
+ enumValues: undefined;
427
+ baseColumn: never;
428
+ identity: undefined;
429
+ generated: undefined;
430
+ }, {}, {}>;
431
+ };
432
+ dialect: "sqlite";
433
+ }>;
@@ -0,0 +1,38 @@
1
+ import { blob, integer, real, sqliteTable, text, uniqueIndex } from 'drizzle-orm/sqlite-core';
2
+ export const blobs = sqliteTable('blobs', {
3
+ id: text('id').primaryKey(),
4
+ contentType: text('content_type').notNull(),
5
+ size: integer('size').notNull(),
6
+ bytes: blob('bytes', { mode: 'buffer' }).notNull(),
7
+ createdAt: integer('created_at').notNull(),
8
+ updatedAt: integer('updated_at').notNull(),
9
+ });
10
+ export const dailyMetrics = sqliteTable('daily_metrics', {
11
+ // Client-generated integer id; not autoincremented.
12
+ id: integer('id').primaryKey({ autoIncrement: false }),
13
+ isoDate: text('iso_date').notNull(),
14
+ metricKey: text('metric_key').notNull(),
15
+ value: real('value').notNull(),
16
+ createdAt: integer('created_at').notNull(),
17
+ updatedAt: integer('updated_at').notNull(),
18
+ }, (t) => ({
19
+ naturalKey: uniqueIndex('dm_natural_key_idx').on(t.isoDate, t.metricKey),
20
+ }));
21
+ export const weeklyMetrics = sqliteTable('weekly_metrics', {
22
+ id: integer('id').primaryKey({ autoIncrement: false }),
23
+ weekStartIsoDate: text('week_start_iso_date').notNull(),
24
+ metricKey: text('metric_key').notNull(),
25
+ value: real('value').notNull(),
26
+ createdAt: integer('created_at').notNull(),
27
+ updatedAt: integer('updated_at').notNull(),
28
+ }, (t) => ({
29
+ naturalKey: uniqueIndex('wm_natural_key_idx').on(t.weekStartIsoDate, t.metricKey),
30
+ }));
31
+ export const sleepSessions = sqliteTable('sleep_sessions', {
32
+ id: integer('id').primaryKey({ autoIncrement: false }),
33
+ isoDate: text('iso_date').notNull(),
34
+ updatedAt: integer('updated_at').notNull(),
35
+ payloadVersion: integer('payload_version').notNull().default(1),
36
+ payload: text('payload', { mode: 'json' }).notNull(),
37
+ });
38
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/db/schema.ts"],"names":[],"mappings":"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"}
package/dist/env.d.ts ADDED
@@ -0,0 +1,8 @@
1
+ import 'dotenv/config';
2
+ export interface Env {
3
+ port: number;
4
+ databaseUrl: string;
5
+ readSecret: string;
6
+ writeSecret: string;
7
+ }
8
+ export declare function loadEnv(): Env;
package/dist/env.js ADDED
@@ -0,0 +1,16 @@
1
+ import 'dotenv/config';
2
+ export function loadEnv() {
3
+ const port = Number(process.env.PORT ?? 3000);
4
+ const databaseUrl = process.env.DATABASE_URL ?? 'file:./data/sync.db';
5
+ const readSecret = required('READ_SECRET');
6
+ const writeSecret = required('WRITE_SECRET');
7
+ return { port, databaseUrl, readSecret, writeSecret };
8
+ }
9
+ function required(name) {
10
+ const value = process.env[name];
11
+ if (!value) {
12
+ throw new Error(`Missing required env var: ${name}`);
13
+ }
14
+ return value;
15
+ }
16
+ //# sourceMappingURL=env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAC;AASvB,MAAM,UAAU,OAAO;IACrB,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC;IAC9C,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,qBAAqB,CAAC;IACtE,MAAM,UAAU,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAC;IAC3C,MAAM,WAAW,GAAG,QAAQ,CAAC,cAAc,CAAC,CAAC;IAC7C,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC;AACxD,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY;IAC5B,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,6BAA6B,IAAI,EAAE,CAAC,CAAC;IACvD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
package/dist/index.js ADDED
@@ -0,0 +1,34 @@
1
+ import { serve } from '@hono/node-server';
2
+ import { Hono } from 'hono';
3
+ import { createDb } from './db/client.js';
4
+ import { runMigrations } from './db/migrate.js';
5
+ import { loadEnv } from './env.js';
6
+ import { dailyMetricsRoutes } from './routes/daily-metrics.js';
7
+ import { healthRoutes } from './routes/health.js';
8
+ import { sleepSessionsRoutes } from './routes/sleep-sessions.js';
9
+ import { weeklyMetricsRoutes } from './routes/weekly-metrics.js';
10
+ import { wipeRoutes } from './routes/wipe.js';
11
+ import { createDailyMetricsStore } from './stores/daily-metrics.js';
12
+ import { createSleepSessionsStore } from './stores/sleep-sessions.js';
13
+ import { createWeeklyMetricsStore } from './stores/weekly-metrics.js';
14
+ const env = loadEnv();
15
+ const db = createDb(env.databaseUrl);
16
+ await runMigrations(db);
17
+ const auth = { readSecret: env.readSecret, writeSecret: env.writeSecret };
18
+ const app = new Hono();
19
+ app.route('/v1/health', healthRoutes(db));
20
+ const dailyMetricsStore = createDailyMetricsStore(db);
21
+ const weeklyMetricsStore = createWeeklyMetricsStore(db);
22
+ const sleepSessionsStore = createSleepSessionsStore(db);
23
+ app.route('/v1/sync/daily-metrics', dailyMetricsRoutes(dailyMetricsStore, auth));
24
+ app.route('/v1/sync/weekly-metrics', weeklyMetricsRoutes(weeklyMetricsStore, auth));
25
+ app.route('/v1/sync/sleep-sessions', sleepSessionsRoutes(sleepSessionsStore, auth));
26
+ app.route('/v1/sync/wipe', wipeRoutes({
27
+ dailyMetrics: dailyMetricsStore,
28
+ weeklyMetrics: weeklyMetricsStore,
29
+ sleepSessions: sleepSessionsStore,
30
+ }, auth));
31
+ serve({ fetch: app.fetch, port: env.port }, (info) => {
32
+ console.info(`zyke-sync listening on http://localhost:${info.port}`);
33
+ });
34
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAE1C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACnC,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAEtE,MAAM,GAAG,GAAG,OAAO,EAAE,CAAC;AACtB,MAAM,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;AAErC,MAAM,aAAa,CAAC,EAAE,CAAC,CAAC;AAExB,MAAM,IAAI,GAAe,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,WAAW,EAAE,GAAG,CAAC,WAAW,EAAE,CAAC;AAEtF,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;AAEvB,GAAG,CAAC,KAAK,CAAC,YAAY,EAAE,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC;AAE1C,MAAM,iBAAiB,GAAG,uBAAuB,CAAC,EAAE,CAAC,CAAC;AACtD,MAAM,kBAAkB,GAAG,wBAAwB,CAAC,EAAE,CAAC,CAAC;AACxD,MAAM,kBAAkB,GAAG,wBAAwB,CAAC,EAAE,CAAC,CAAC;AAExD,GAAG,CAAC,KAAK,CAAC,wBAAwB,EAAE,kBAAkB,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC,CAAC;AACjF,GAAG,CAAC,KAAK,CAAC,yBAAyB,EAAE,mBAAmB,CAAC,kBAAkB,EAAE,IAAI,CAAC,CAAC,CAAC;AACpF,GAAG,CAAC,KAAK,CAAC,yBAAyB,EAAE,mBAAmB,CAAC,kBAAkB,EAAE,IAAI,CAAC,CAAC,CAAC;AACpF,GAAG,CAAC,KAAK,CACP,eAAe,EACf,UAAU,CACR;IACE,YAAY,EAAE,iBAAiB;IAC/B,aAAa,EAAE,kBAAkB;IACjC,aAAa,EAAE,kBAAkB;CAClC,EACD,IAAI,CACL,CACF,CAAC;AAEF,KAAK,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE;IACnD,OAAO,CAAC,IAAI,CAAC,2CAA2C,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;AACvE,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ import 'dotenv/config';
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env node
2
+ import 'dotenv/config';
3
+ import { createDb } from './db/client.js';
4
+ import { runMigrations } from './db/migrate.js';
5
+ const databaseUrl = process.env.DATABASE_URL ?? 'file:./data/sync.db';
6
+ const db = createDb(databaseUrl);
7
+ await runMigrations(db);
8
+ console.info(`zyke-sync: migrations applied to ${databaseUrl}`);
9
+ //# sourceMappingURL=migrate-cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate-cli.js","sourceRoot":"","sources":["../src/migrate-cli.ts"],"names":[],"mappings":";AACA,OAAO,eAAe,CAAC;AACvB,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,qBAAqB,CAAC;AACtE,MAAM,EAAE,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC;AACjC,MAAM,aAAa,CAAC,EAAE,CAAC,CAAC;AACxB,OAAO,CAAC,IAAI,CAAC,oCAAoC,WAAW,EAAE,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { type AccessLevel, type AuthConfig } from '@zykeco/server-core';
2
+ import type { MiddlewareHandler } from 'hono';
3
+ export interface AuthEnv {
4
+ Variables: Record<string, never>;
5
+ }
6
+ export declare function requireAuth(level: AccessLevel, auth: AuthConfig): MiddlewareHandler;
@@ -0,0 +1,20 @@
1
+ import { verifySecret } from '@zykeco/server-core';
2
+ function extractBearer(c) {
3
+ const header = c.req.header('authorization') ?? c.req.header('Authorization');
4
+ if (!header)
5
+ return undefined;
6
+ const [scheme, token] = header.split(' ');
7
+ if (scheme?.toLowerCase() !== 'bearer' || !token)
8
+ return undefined;
9
+ return token;
10
+ }
11
+ export function requireAuth(level, auth) {
12
+ return async (c, next) => {
13
+ const presented = extractBearer(c);
14
+ if (!verifySecret(presented, level, auth)) {
15
+ return c.json({ code: 'unauthorized', message: 'invalid or missing bearer token' }, 401);
16
+ }
17
+ await next();
18
+ };
19
+ }
20
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/routes/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAqC,MAAM,qBAAqB,CAAC;AAOtF,SAAS,aAAa,CAAC,CAAU;IAC/B,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;IAC9E,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAC9B,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC1C,IAAI,MAAM,EAAE,WAAW,EAAE,KAAK,QAAQ,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IACnE,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAkB,EAAE,IAAgB;IAC9D,OAAO,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;QACvB,MAAM,SAAS,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;QACnC,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC;YAC1C,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,iCAAiC,EAAE,EAAE,GAAG,CAAC,CAAC;QAC3F,CAAC;QACD,MAAM,IAAI,EAAE,CAAC;IACf,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { AuthConfig, DailyMetricsStore } from '@zykeco/server-core';
2
+ import { Hono } from 'hono';
3
+ export declare function dailyMetricsRoutes(store: DailyMetricsStore, auth: AuthConfig): Hono;