From 4d6840559d9677fbba9e77c7453a9aeab1882186 Mon Sep 17 00:00:00 2001 From: Ryan Pandya Date: Tue, 26 Nov 2024 13:54:41 -0800 Subject: [PATCH] Hour get and update works - and CLI for it --- apps/cli/package.json | 1 + apps/cli/src/commands/days.ts | 11 +- apps/cli/src/commands/hours.ts | 67 +++ apps/cli/src/index.ts | 2 + .../web/components/dashboard/days/DayView.tsx | 5 + ...rful_zodiak.sql => 0000_even_mysterio.sql} | 17 +- .../db/migrations/meta/0000_snapshot.json | 89 ++- packages/db/migrations/meta/_journal.json | 4 +- packages/db/package.json | 5 +- packages/db/reset.ts | 93 +++ packages/db/schema.ts | 71 ++- {scripts => packages/db/seed}/apiKey.json | 0 {scripts => packages/db/seed}/category.json | 0 {scripts => packages/db/seed}/color.json | 0 {scripts => packages/db/seed}/user.json | 0 packages/shared/package.json | 2 + packages/shared/types/days.ts | 15 + packages/shared/utils/days.ts | 13 + packages/shared/utils/hours.ts | 28 + packages/trpc/routers/_app.ts | 2 + packages/trpc/routers/days.ts | 68 ++- packages/trpc/routers/hours.ts | 111 ++++ pnpm-lock.yaml | 543 +++++++++++++++--- scripts/create_user.sh | 93 +++ 24 files changed, 1080 insertions(+), 160 deletions(-) create mode 100644 apps/cli/src/commands/hours.ts rename packages/db/migrations/{0000_powerful_zodiak.sql => 0000_even_mysterio.sql} (87%) create mode 100644 packages/db/reset.ts rename {scripts => packages/db/seed}/apiKey.json (100%) rename {scripts => packages/db/seed}/category.json (100%) rename {scripts => packages/db/seed}/color.json (100%) rename {scripts => packages/db/seed}/user.json (100%) create mode 100644 packages/shared/utils/days.ts create mode 100644 packages/shared/utils/hours.ts create mode 100644 packages/trpc/routers/hours.ts create mode 100755 scripts/create_user.sh diff --git a/apps/cli/package.json b/apps/cli/package.json index 865325e..4e04d9a 100644 --- a/apps/cli/package.json +++ b/apps/cli/package.json @@ -18,6 +18,7 @@ "dependencies": { "@date-fns/tz": "^1.2.0", "@lifetracker/db": "workspace:*", + "@lifetracker/shared": "workspace:^", "@lifetracker/trpc": "workspace:^", "date-fns": "^4.1.0", "dotenv": "^16.4.1", diff --git a/apps/cli/src/commands/days.ts b/apps/cli/src/commands/days.ts index f9b978d..21eeeca 100644 --- a/apps/cli/src/commands/days.ts +++ b/apps/cli/src/commands/days.ts @@ -10,6 +10,7 @@ import { Command } from "@commander-js/extra-typings"; import { getBorderCharacters, table } from "table"; import { format } from "date-fns"; import { TZDate } from "@date-fns/tz"; +import { getHourFromTime, getTimeFromHour } from "@lifetracker/shared/utils/hours"; function moodToStars(mood: number) { // const full_stars = Math.floor(mood / 2); @@ -41,17 +42,21 @@ export const daysCmd = new Command() const moodStr = moodToStars(day.mood); const dateStr = format(day.date, "EEEE, MMMM do"); - const data: string[][] = [[dateStr, moodStr], [day.comment ?? "No comment", '',]]; + const data: string[][] = [[dateStr, '', moodStr], [day.comment ?? "No comment", '', '']]; + + day.hours.forEach((h) => { + data.push([getHourFromTime(h.time), h.categoryCode ?? "--", h.comment ?? ""]); + }) console.log(table(data, { // border: getBorderCharacters("ramac"), // singleLine: true, - spanningCells: [{ col: 0, row: 1, colSpan: 2 }], + spanningCells: [{ col: 0, row: 1, colSpan: 3 }, { col: 1, row: 2, colSpan: 2 }], drawVerticalLine: (lineIndex, columnCount) => { return lineIndex === 0 || lineIndex === columnCount || (lineIndex === 0 && columnCount === 2); }, drawHorizontalLine: (lineIndex, rowCount) => { - return (lineIndex < 2 || lineIndex === rowCount); + return (lineIndex < 2 || lineIndex === 2 || lineIndex === rowCount); }, })); } diff --git a/apps/cli/src/commands/hours.ts b/apps/cli/src/commands/hours.ts new file mode 100644 index 0000000..c57ff1b --- /dev/null +++ b/apps/cli/src/commands/hours.ts @@ -0,0 +1,67 @@ +import { getGlobalOptions } from "@/lib/globals"; +import { + printError, + printErrorMessageWithReason, + printObject, + printSuccess, +} from "@/lib/output"; +import { getAPIClient } from "@/lib/trpc"; +import { Command } from "@commander-js/extra-typings"; +import { getBorderCharacters, table } from "table"; +import { format } from "date-fns"; +import { TZDate } from "@date-fns/tz"; +import { getHourFromTime, getTimeFromHour } from "@lifetracker/shared/utils/hours"; +import { ZHour } from "@lifetracker/shared/types/days"; + +export const hoursCmd = new Command() + .name("hour") + .description("Get or set data for a specific hour") + .argument('', 'A date in ISO-8601 format, or "yesterday", "today", "tomorrow", etc.') + .argument('', 'An hour between 0-23, or 1-12 [AM/PM]') + .argument('[code]', 'Optionally set the code for this hour') + .option('-c, --comment ', "edit this hour's comment") + .action(async (dateQuery = "today", hour: string, code: string | undefined, flags?) => { + const api = getAPIClient(); + + let res: string | ZHour; + try { + const props = { dateQuery: dateQuery, time: getTimeFromHour(hour), code: code, ...flags }; + if (code) { + // Update + console.log(props); + res = await api.hours.update.mutate({ ...props }); + } + else { + // Get + res = await api.hours.get.query({ ...props }); + } + + } + catch (error) { + printErrorMessageWithReason("Failed to manipulate hour", error as object); + } + + if (getGlobalOptions().json) { + printObject(res); + } else { + const data = [ + ['Doing:', res.categoryName ?? "Undefined"], + + ]; + if (res.comment) { + data.push(['Comment:', res.comment ?? "Undefined"]); + } + console.log(table(data, { + // border: getBorderCharacters("ramac"), + // singleLine: true, + // spanningCells: [{ col: 0, row: 0, colSpan: 2 },], + header: { alignment: "center", content: `${format(res.date, "EEEE, MMMM dd")} at ${getHourFromTime(res.time, true)}` }, + drawVerticalLine: (lineIndex, columnCount) => { + return lineIndex === 0 || lineIndex === columnCount || (lineIndex === 0 && columnCount === 2); + }, + drawHorizontalLine: (lineIndex, rowCount) => { + return (lineIndex < 2 || lineIndex === 2 || lineIndex === rowCount); + }, + })); + } + }); diff --git a/apps/cli/src/index.ts b/apps/cli/src/index.ts index a0b17fb..97f036d 100644 --- a/apps/cli/src/index.ts +++ b/apps/cli/src/index.ts @@ -5,6 +5,7 @@ import { whoamiCmd } from "@/commands/whoami"; import { colorsCmd } from "@/commands/colors"; import { categoriesCmd } from "@/commands/categories"; import { daysCmd } from "@/commands/days"; +import { hoursCmd } from "./commands/hours"; import { config } from "dotenv"; @@ -40,6 +41,7 @@ program.addCommand(whoamiCmd); program.addCommand(daysCmd); program.addCommand(colorsCmd); program.addCommand(categoriesCmd); +program.addCommand(hoursCmd); setGlobalOptions(program.opts()); diff --git a/apps/web/components/dashboard/days/DayView.tsx b/apps/web/components/dashboard/days/DayView.tsx index a2c17bb..e975675 100644 --- a/apps/web/components/dashboard/days/DayView.tsx +++ b/apps/web/components/dashboard/days/DayView.tsx @@ -42,6 +42,11 @@ export default async function DayView({ + + + + {day.hours} + ); } diff --git a/packages/db/migrations/0000_powerful_zodiak.sql b/packages/db/migrations/0000_even_mysterio.sql similarity index 87% rename from packages/db/migrations/0000_powerful_zodiak.sql rename to packages/db/migrations/0000_even_mysterio.sql index 2ae88a9..bdb439d 100644 --- a/packages/db/migrations/0000_powerful_zodiak.sql +++ b/packages/db/migrations/0000_even_mysterio.sql @@ -57,19 +57,21 @@ CREATE TABLE `day` ( `id` text PRIMARY KEY NOT NULL, `date` text NOT NULL, `mood` integer, - `comment` text + `comment` text, + `userId` text NOT NULL, + FOREIGN KEY (`userId`) REFERENCES `user`(`id`) ON UPDATE no action ON DELETE cascade ); --> statement-breakpoint -CREATE TABLE `entry` ( +CREATE TABLE `hour` ( `id` text PRIMARY KEY NOT NULL, `createdAt` integer NOT NULL, `userId` text NOT NULL, `comment` text, - `dayId` integer, - `startedAt` integer NOT NULL, - `endedAt` integer NOT NULL, - `categoryId` text NOT NULL, + `time` integer, + `dayId` text NOT NULL, + `categoryId` text, FOREIGN KEY (`userId`) REFERENCES `user`(`id`) ON UPDATE no action ON DELETE cascade, + FOREIGN KEY (`dayId`) REFERENCES `day`(`id`) ON UPDATE no action ON DELETE no action, FOREIGN KEY (`categoryId`) REFERENCES `category`(`id`) ON UPDATE no action ON DELETE no action ); --> statement-breakpoint @@ -102,5 +104,6 @@ CREATE UNIQUE INDEX `apiKey_name_userId_unique` ON `apiKey` (`name`,`userId`);-- CREATE UNIQUE INDEX `category_userId_code_unique` ON `category` (`userId`,`code`);--> statement-breakpoint CREATE UNIQUE INDEX `color_userId_name_unique` ON `color` (`userId`,`name`);--> statement-breakpoint CREATE UNIQUE INDEX `day_date_unique` ON `day` (`date`);--> statement-breakpoint -CREATE UNIQUE INDEX `entry_userId_startedAt_endedAt_unique` ON `entry` (`userId`,`startedAt`,`endedAt`);--> statement-breakpoint +CREATE UNIQUE INDEX `hour_time_unique` ON `hour` (`time`);--> statement-breakpoint +CREATE UNIQUE INDEX `hour_dayId_time_unique` ON `hour` (`dayId`,`time`);--> statement-breakpoint CREATE UNIQUE INDEX `user_email_unique` ON `user` (`email`); \ No newline at end of file diff --git a/packages/db/migrations/meta/0000_snapshot.json b/packages/db/migrations/meta/0000_snapshot.json index c61c882..350f9a4 100644 --- a/packages/db/migrations/meta/0000_snapshot.json +++ b/packages/db/migrations/meta/0000_snapshot.json @@ -1,7 +1,7 @@ { "version": "6", "dialect": "sqlite", - "id": "ceed45ad-37d0-4e59-92bd-3be02d271535", + "id": "ac3ad6ee-ccd2-4f91-9be7-83bd5b1d9ec8", "prevId": "00000000-0000-0000-0000-000000000000", "tables": { "account": { @@ -434,6 +434,13 @@ "primaryKey": false, "notNull": false, "autoincrement": false + }, + "userId": { + "name": "userId", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false } }, "indexes": { @@ -445,12 +452,26 @@ "isUnique": true } }, - "foreignKeys": {}, + "foreignKeys": { + "day_userId_user_id_fk": { + "name": "day_userId_user_id_fk", + "tableFrom": "day", + "tableTo": "user", + "columnsFrom": [ + "userId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, "compositePrimaryKeys": {}, "uniqueConstraints": {} }, - "entry": { - "name": "entry", + "hour": { + "name": "hour", "columns": { "id": { "name": "id", @@ -480,23 +501,16 @@ "notNull": false, "autoincrement": false }, - "dayId": { - "name": "dayId", + "time": { + "name": "time", "type": "integer", "primaryKey": false, "notNull": false, "autoincrement": false }, - "startedAt": { - "name": "startedAt", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "endedAt": { - "name": "endedAt", - "type": "integer", + "dayId": { + "name": "dayId", + "type": "text", "primaryKey": false, "notNull": true, "autoincrement": false @@ -505,25 +519,31 @@ "name": "categoryId", "type": "text", "primaryKey": false, - "notNull": true, + "notNull": false, "autoincrement": false } }, "indexes": { - "entry_userId_startedAt_endedAt_unique": { - "name": "entry_userId_startedAt_endedAt_unique", + "hour_time_unique": { + "name": "hour_time_unique", "columns": [ - "userId", - "startedAt", - "endedAt" + "time" + ], + "isUnique": true + }, + "hour_dayId_time_unique": { + "name": "hour_dayId_time_unique", + "columns": [ + "dayId", + "time" ], "isUnique": true } }, "foreignKeys": { - "entry_userId_user_id_fk": { - "name": "entry_userId_user_id_fk", - "tableFrom": "entry", + "hour_userId_user_id_fk": { + "name": "hour_userId_user_id_fk", + "tableFrom": "hour", "tableTo": "user", "columnsFrom": [ "userId" @@ -534,9 +554,22 @@ "onDelete": "cascade", "onUpdate": "no action" }, - "entry_categoryId_category_id_fk": { - "name": "entry_categoryId_category_id_fk", - "tableFrom": "entry", + "hour_dayId_day_id_fk": { + "name": "hour_dayId_day_id_fk", + "tableFrom": "hour", + "tableTo": "day", + "columnsFrom": [ + "dayId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "hour_categoryId_category_id_fk": { + "name": "hour_categoryId_category_id_fk", + "tableFrom": "hour", "tableTo": "category", "columnsFrom": [ "categoryId" diff --git a/packages/db/migrations/meta/_journal.json b/packages/db/migrations/meta/_journal.json index 6e887c6..e09637e 100644 --- a/packages/db/migrations/meta/_journal.json +++ b/packages/db/migrations/meta/_journal.json @@ -5,8 +5,8 @@ { "idx": 0, "version": "6", - "when": 1732544381615, - "tag": "0000_powerful_zodiak", + "when": 1732648521848, + "tag": "0000_even_mysterio", "breakpoints": true } ] diff --git a/packages/db/package.json b/packages/db/package.json index 411de91..aa0d016 100644 --- a/packages/db/package.json +++ b/packages/db/package.json @@ -7,7 +7,7 @@ "scripts": { "dev": "drizzle-kit studio", "generate": "drizzle-kit generate", - "reset": "tsc reset.ts", + "reset": "tsx reset.ts", "typecheck": "tsc --noEmit", "migrate": "tsx migrate.ts", "studio": "drizzle-kit studio" @@ -26,7 +26,8 @@ "@lifetracker/typescript-config": "workspace:*", "@tsconfig/node21": "^21.0.1", "@types/better-sqlite3": "^7.6.9", - "drizzle-kit": "^0.24.2" + "drizzle-kit": "^0.24.2", + "sqlite3": "^5.1.7" }, "eslintConfig": { "root": true, diff --git a/packages/db/reset.ts b/packages/db/reset.ts new file mode 100644 index 0000000..52294d0 --- /dev/null +++ b/packages/db/reset.ts @@ -0,0 +1,93 @@ +import sqlite3 from 'sqlite3'; +import fs from 'fs'; +import path from 'path'; + + +// Read JSON files +const users = JSON.parse(fs.readFileSync('./seed/user.json', 'utf-8')); +const apiKeys = JSON.parse(fs.readFileSync('./seed/apiKey.json', 'utf-8')); +const colors = JSON.parse(fs.readFileSync('./seed/color.json', 'utf-8')); +const categories = JSON.parse(fs.readFileSync('./seed/category.json', 'utf-8')); + +// Connect to SQLite +const db = new sqlite3.Database('/home/ryan/Notes/lifetracker/lifetracker.db'); + +// Helper function to insert data +const insertData = (table, columns, values) => { + const placeholders = columns.map(() => '?').join(', '); + const sql = `INSERT INTO ${table} (${columns.join(', ')}) VALUES (${placeholders})`; + db.run(sql, values, (err) => { + if (err) { + console.error(`Error inserting into ${table}:`, err.message); + } + }); +}; + +// Insert users +users.forEach(user => { + insertData( + 'user', + ['id', 'name', 'email', 'emailVerified', 'image', 'password', 'role'], + [ + user.id, + user.name, + user.email, + user.emailVerified || null, + user.image || null, + user.password, + user.role || 'user' + ] + ); +}); + +// Insert API keys +apiKeys.forEach(apiKey => { + insertData( + 'apiKey', + ['id', 'keyHash', 'keyId', 'name', 'userId', 'createdAt'], + [ + apiKey.id, + apiKey.keyHash, + apiKey.keyId, + apiKey.name, + apiKey.userId, + apiKey.createdAt || new Date().toISOString() + ] + ); +}); +categories.forEach(category => { + insertData( + 'category', + ['id', 'code', 'colorId', 'createdAt', 'description', 'name', 'parentId', 'userId'], + [ + category.id, + category.code, + category.colorId || null, + category.createdAt || new Date().toISOString(), + category.description || null, + category.name, + category.parentId || null, + category.userId + ] + ); +}); + +colors.forEach(color => { + insertData( + 'color', + ['id', 'name', 'hexcode', 'inverse', 'userId', 'createdAt'], + [ + color.id, + color.name, + color.hexcode, + color.inverse || null, + color.userId, + color.createdAt || new Date().toISOString() + ] + ); +}); + +// Close the connection +db.close(() => { + console.log('Database population completed!'); +}); diff --git a/packages/db/schema.ts b/packages/db/schema.ts index 31907b5..c775588 100644 --- a/packages/db/schema.ts +++ b/packages/db/schema.ts @@ -130,8 +130,34 @@ export const days = sqliteTable("day", { date: text("date").notNull().unique(), mood: integer("mood"), comment: text("comment"), + userId: text("userId") + .notNull() + .references(() => users.id, { onDelete: "cascade" }), + }); +export const hours = sqliteTable( + "hour", + { + id: text("id") + .notNull() + .primaryKey() + .$defaultFn(() => createId()), + createdAt: createdAtField(), + userId: text("userId") + .notNull() + .references(() => users.id, { onDelete: "cascade" }), + comment: text("comment"), + time: integer("time").unique(), + dayId: text("dayId").notNull().references(() => days.id), + categoryId: text("categoryId").references(() => categories.id), + }, + (e) => ({ + uniq: unique().on(e.dayId, e.time) + }), +) + + export const colors = sqliteTable( "color", { @@ -179,27 +205,7 @@ export const categories = sqliteTable( }), ); -export const entries = sqliteTable( - "entry", - { - id: text("id") - .notNull() - .primaryKey() - .$defaultFn(() => createId()), - createdAt: createdAtField(), - userId: text("userId") - .notNull() - .references(() => users.id, { onDelete: "cascade" }), - comment: text("comment"), - dayId: integer("dayId"), - startedAt: integer("startedAt", { mode: "timestamp" }).notNull(), - endedAt: integer("endedAt", { mode: "timestamp" }).notNull(), - categoryId: text("categoryId").notNull().references(() => categories.id), - }, - (e) => ({ - uniq: unique().on(e.userId, e.startedAt, e.endedAt) - }), -) + // Relations @@ -212,7 +218,8 @@ export const apiKeyRelations = relations(apiKeys, ({ one }) => ({ export const userRelations = relations(users, ({ many }) => ({ categories: many(categories), colors: many(colors), - entries: many(entries), + days: many(days), + hours: many(hours), })); @@ -242,31 +249,35 @@ export const categoriesRelations = relations( fields: [categories.parentId], references: [categories.id], }), - entries: many(entries), + hours: many(hours), }), ); export const daysRelations = relations( days, - ({ many }) => ({ - entries: many(entries), + ({ many, one }) => ({ + user: one(users, { + fields: [days.userId], + references: [users.id], + }), + hours: many(hours), }), ); -export const entriesRelations = relations( - entries, +export const hoursRelations = relations( + hours, ({ many, one }) => ({ user: one(users, { - fields: [entries.userId], + fields: [hours.userId], references: [users.id], }), categories: one(categories, { - fields: [entries.categoryId], + fields: [hours.categoryId], references: [categories.id], } ), day: one(days, { - fields: [entries.dayId], + fields: [hours.dayId], references: [days.id], }), }), diff --git a/scripts/apiKey.json b/packages/db/seed/apiKey.json similarity index 100% rename from scripts/apiKey.json rename to packages/db/seed/apiKey.json diff --git a/scripts/category.json b/packages/db/seed/category.json similarity index 100% rename from scripts/category.json rename to packages/db/seed/category.json diff --git a/scripts/color.json b/packages/db/seed/color.json similarity index 100% rename from scripts/color.json rename to packages/db/seed/color.json diff --git a/scripts/user.json b/packages/db/seed/user.json similarity index 100% rename from scripts/user.json rename to packages/db/seed/user.json diff --git a/packages/shared/package.json b/packages/shared/package.json index 890b360..a321c21 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -5,6 +5,8 @@ "private": true, "type": "module", "dependencies": { + "@date-fns/tz": "^1.2.0", + "date-fns": "^4.1.0", "winston": "^3.17.0", "zod": "^3.23.8" }, diff --git a/packages/shared/types/days.ts b/packages/shared/types/days.ts index 4dc0a4a..0e1b9e5 100644 --- a/packages/shared/types/days.ts +++ b/packages/shared/types/days.ts @@ -1,9 +1,24 @@ import { z } from "zod"; +// Define the schema for the "hour" object +export const zHourSchema = z.object({ + id: z.string().optional(), + dayId: z.string(), + date: z.string().optional(), + time: z.number(), + categoryCode: z.coerce.number().nullable(), + categoryId: z.string().nullable(), + categoryName: z.string().nullable(), + comment: z.string().nullable(), +}); +export type ZHour = z.infer; + export const zDaySchema = z.object({ id: z.string().optional(), date: z.string(), mood: z.number().nullable(), comment: z.string().nullable(), + hours: z.array(zHourSchema), + }); export type ZDay = z.infer; diff --git a/packages/shared/utils/days.ts b/packages/shared/utils/days.ts new file mode 100644 index 0000000..0ce3c1f --- /dev/null +++ b/packages/shared/utils/days.ts @@ -0,0 +1,13 @@ +import { format } from "date-fns"; +import { TZDate } from "@date-fns/tz"; + +export function dateFromInput(input: { dateQuery: string }) { + let t: string; + if (input.dateQuery == "today") { + t = TZDate.tz("America/Los_Angeles"); + } + else { + t = new TZDate(input.dateQuery, "Etc/UTC"); + } + return format(t, "yyyy-MM-dd") + "T00:00:00"; +} \ No newline at end of file diff --git a/packages/shared/utils/hours.ts b/packages/shared/utils/hours.ts new file mode 100644 index 0000000..f8a3ce4 --- /dev/null +++ b/packages/shared/utils/hours.ts @@ -0,0 +1,28 @@ +export function getHourFromTime(time: number, includePeriod = false) { + const hour = time == 0 || time == 12 ? 12 : time % 12; + const period = time < 12 ? "AM" : "PM"; + return includePeriod ? `${hour} ${period}` : `${hour}`; +} + +export function getTimeFromHour(hour: string) { + const match = hour.match(/^(\d{1,2}) ?([aApP][mM])?$/); + if (!match) { + throw new Error("Invalid time format"); + } + + let time = parseInt(match[1]); + const period = match[2] ? match[2].toUpperCase() : null; + + if (time > 12 || time < 1) { + throw new Error("Invalid hour"); + } + + if (period === 'PM' && time !== 12) { + time += 12; + } else if (period === 'AM' && time === 12) { + time = 0; + } + + return time; +} + diff --git a/packages/trpc/routers/_app.ts b/packages/trpc/routers/_app.ts index f426b43..b8c5832 100644 --- a/packages/trpc/routers/_app.ts +++ b/packages/trpc/routers/_app.ts @@ -6,12 +6,14 @@ import { adminAppRouter } from "./admin"; import { categoriesAppRouter } from "./categories"; import { colorsAppRouter } from "./colors"; import { daysAppRouter } from "./days"; +import { hoursAppRouter } from "./hours"; export const appRouter = router({ users: usersAppRouter, apiKeys: apiKeysAppRouter, admin: adminAppRouter, days: daysAppRouter, + hours: hoursAppRouter, colors: colorsAppRouter, categories: categoriesAppRouter, }); diff --git a/packages/trpc/routers/days.ts b/packages/trpc/routers/days.ts index c61efb3..89ffe38 100644 --- a/packages/trpc/routers/days.ts +++ b/packages/trpc/routers/days.ts @@ -3,33 +3,22 @@ import { and, desc, eq, inArray, notExists } from "drizzle-orm"; import { z } from "zod"; import { SqliteError } from "@lifetracker/db"; -import { days, } from "@lifetracker/db/schema"; +import { categories, days, hours, } from "@lifetracker/db/schema"; import { zDaySchema, ZDay } from "@lifetracker/shared/types/days"; import type { Context } from "../index"; import { authedProcedure, router } from "../index"; -import { format } from "date-fns"; -import { TZDate } from "@date-fns/tz"; - -function dateFromInput(input: { dateQuery: string }) { - let t: string; - if (input.dateQuery == "today") { - t = TZDate.tz("America/Los_Angeles"); - } - else { - t = new TZDate(input.dateQuery, "Etc/UTC"); - } - - return format(t, "yyyy-MM-dd") + "T00:00:00"; -} +import { dateFromInput } from "@lifetracker/shared/utils/days"; async function createDay(date: string, ctx: Context) { return await ctx.db.transaction(async (trx) => { try { - const result = await trx + // Create the Day object + const dayRes = await trx .insert(days) .values({ + userId: ctx.user!.id, date: date, }) .returning({ @@ -38,7 +27,20 @@ async function createDay(date: string, ctx: Context) { mood: days.mood, comment: days.comment, }); - return result[0]; + + const dayId = dayRes[0].id; + + // Generate 24 "hour" objects + const hoursData = Array.from({ length: 24 }, (_, hour) => ({ + userId: ctx.user!.id, + dayId: dayId, + time: hour + })); + + // Insert the "hour" objects + await trx.insert(hours).values(hoursData); + + return dayRes; } catch (e) { console.log(e); if (e instanceof SqliteError) { @@ -66,7 +68,9 @@ export const daysAppRouter = router({ .query(async ({ input, ctx }) => { const date = dateFromInput(input); - const res = await ctx.db + // Fetch the day data + let dayRes; + dayRes = await ctx.db .select({ id: days.id, date: days.date, @@ -76,8 +80,32 @@ export const daysAppRouter = router({ .from(days) .where(eq(days.date, date)); - const day = res.length == 0 ? createDay(date, ctx) : res[0]; - return day; + if (dayRes.length === 0) { + dayRes = await createDay(date, ctx); + } + + const day = dayRes[0]; + + // Fetch the hours data for the corresponding dayId + const hoursRes = await ctx.db + .select({ + id: hours.id, + dayId: hours.dayId, + time: hours.time, + categoryId: hours.categoryId, + categoryCode: categories.code, + comment: hours.comment, + }) + .from(hours) + .where(eq(hours.dayId, day.id)) + .leftJoin(categories, eq(categories.id, hours.categoryId)) + + // Combine the day and hours data + const result = { + ...day, + hours: hoursRes, + }; + return result; }), update: authedProcedure .input( diff --git a/packages/trpc/routers/hours.ts b/packages/trpc/routers/hours.ts new file mode 100644 index 0000000..6656c04 --- /dev/null +++ b/packages/trpc/routers/hours.ts @@ -0,0 +1,111 @@ +import { experimental_trpcMiddleware, TRPCError } from "@trpc/server"; +import { and, desc, eq, inArray, notExists } from "drizzle-orm"; +import { date, z } from "zod"; + +import { SqliteError } from "@lifetracker/db"; +import { categories, days, hours, } from "@lifetracker/db/schema"; +import { + zDaySchema, ZDay, ZHour, zHourSchema +} from "@lifetracker/shared/types/days"; +import type { Context } from "../index"; +import { authedProcedure, router } from "../index"; +import { format } from "date-fns"; +import { TZDate } from "@date-fns/tz"; +import { dateFromInput } from "@lifetracker/shared/utils/days"; + +export const hoursAppRouter = router({ + get: authedProcedure + .input(z.object({ + dateQuery: z.string(), + time: z.number() + })) + .output(zHourSchema) + .query(async ({ input, ctx }) => { + const date = dateFromInput(input); + console.log(input); + const hourRes = await ctx.db + .select({ + id: hours.id, + dayId: hours.dayId, + time: hours.time, + categoryId: hours.categoryId, + categoryCode: categories.code, + categoryName: categories.name, + comment: hours.comment, + }) + .from(hours) + .leftJoin(days, eq(days.id, hours.dayId)) // Ensure days table is joined first + .leftJoin(categories, eq(categories.id, hours.categoryId)) + .where(and(eq(hours.time, input.time), eq(days.date, date))) // Use correct alias for days table + + console.log(hourRes); + return { + date: format(date, "yyyy-MM-dd"), + ...hourRes[0] + }; + }), + update: authedProcedure + .input( + z.object({ + dateQuery: z.string(), + time: z.number(), + code: z.string().optional(), + comment: z.string().nullable(), + }), + ) + // .output(zHourSchema) + .mutation(async ({ input, ctx }) => { + const { dateQuery, time, code, ...updatedProps } = input; + var date = dateFromInput({ dateQuery: dateQuery }); + const category = await ctx.db.select( + { + id: categories.id, + name: categories.name, + } + ) + .from(categories) + .where( + and( + eq(categories.code, code), + eq(categories.userId, ctx.user!.id), + ) + ); + + + const day = await ctx.db.select( + { id: days.id } + ) + .from(days) + .where( + and( + eq(days.date, date), + eq(days.userId, ctx.user!.id), + ) + ); + + const newProps = { + categoryId: category[0].id, + ...updatedProps + }; + + if (newProps.comment == "") { newProps.comment = null } + + const hourRes = await ctx.db + .update(hours) + .set(newProps) + .where( + and( + eq(hours.time, time), + eq(hours.dayId, day[0].id), + eq(hours.userId, ctx.user!.id) + ) + ) + .returning(); + + return { + date: format(date, "yyyy-MM-dd"), + categoryName: category[0].name, + ...hourRes[0] + } + }), +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 56fb564..bf6ddd7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -26,6 +26,9 @@ importers: '@lifetracker/db': specifier: workspace:* version: link:../../packages/db + '@lifetracker/shared': + specifier: workspace:^ + version: link:../../packages/shared '@lifetracker/trpc': specifier: workspace:^ version: link:../../packages/trpc @@ -249,7 +252,7 @@ importers: version: 1.11.13 drizzle-orm: specifier: ^0.33.0 - version: 0.33.0(@types/better-sqlite3@7.6.11)(@types/react@18.2.61)(better-sqlite3@11.5.0)(expo-sqlite@14.0.6(expo@51.0.36(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0))))(react@18.3.1) + version: 0.33.0(@types/better-sqlite3@7.6.11)(@types/react@18.2.61)(better-sqlite3@11.5.0)(expo-sqlite@14.0.6(expo@51.0.36(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0))(encoding@0.1.13)))(react@18.3.1)(sqlite3@5.1.7) fastest-levenshtein: specifier: ^1.0.16 version: 1.0.16 @@ -394,10 +397,10 @@ importers: version: 16.4.5 drizzle-orm: specifier: ^0.33.0 - version: 0.33.0(@types/better-sqlite3@7.6.11)(@types/react@18.2.61)(better-sqlite3@11.5.0)(expo-sqlite@14.0.6(expo@51.0.36(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0))))(react@18.3.1) + version: 0.33.0(@types/better-sqlite3@7.6.11)(@types/react@18.2.61)(better-sqlite3@11.5.0)(expo-sqlite@14.0.6(expo@51.0.36(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0))(encoding@0.1.13)))(react@18.3.1)(sqlite3@5.1.7) expo-sqlite: specifier: ^14.0.6 - version: 14.0.6(expo@51.0.36(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0))) + version: 14.0.6(expo@51.0.36(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0))(encoding@0.1.13)) tsx: specifier: ^4.7.1 version: 4.19.1 @@ -417,6 +420,9 @@ importers: drizzle-kit: specifier: ^0.24.2 version: 0.24.2 + sqlite3: + specifier: ^5.1.7 + version: 5.1.7 packages/eslint-config: devDependencies: @@ -463,6 +469,12 @@ importers: packages/shared: dependencies: + '@date-fns/tz': + specifier: ^1.2.0 + version: 1.2.0 + date-fns: + specifier: ^4.1.0 + version: 4.1.0 winston: specifier: ^3.17.0 version: 3.17.0 @@ -499,10 +511,10 @@ importers: version: 18.3.1 react-native: specifier: '*' - version: 0.76.2(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0))(@types/react@18.2.61)(react@18.3.1) + version: 0.76.2(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0))(@types/react@18.2.61)(encoding@0.1.13)(react@18.3.1) react-native-web: specifier: '*' - version: 0.19.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 0.19.13(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) superjson: specifier: ^2.2.1 version: 2.2.1 @@ -524,7 +536,7 @@ importers: version: 0.5.15(tailwindcss@3.4.15(ts-node@10.9.1(@types/node@20.11.24)(typescript@5.6.3))) nativewind: specifier: ^4.0.1 - version: 4.1.23(react-native-reanimated@3.16.1(@babel/core@7.26.0)(react-native@0.76.2(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0))(@types/react@18.2.61)(react@18.3.1))(react@18.3.1))(react-native@0.76.2(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0))(@types/react@18.2.61)(react@18.3.1))(react@18.3.1)(tailwindcss@3.4.15(ts-node@10.9.1(@types/node@20.11.24)(typescript@5.6.3))) + version: 4.1.23(react-native-reanimated@3.16.1(@babel/core@7.26.0)(react-native@0.76.2(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0))(@types/react@18.2.61)(encoding@0.1.13)(react@18.3.1))(react@18.3.1))(react-native@0.76.2(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0))(@types/react@18.2.61)(encoding@0.1.13)(react@18.3.1))(react@18.3.1)(tailwindcss@3.4.15(ts-node@10.9.1(@types/node@20.11.24)(typescript@5.6.3))) postcss: specifier: ^8.4.35 version: 8.4.47 @@ -579,7 +591,7 @@ importers: version: 4.1.0 drizzle-orm: specifier: ^0.33.0 - version: 0.33.0(@types/better-sqlite3@7.6.11)(@types/react@18.2.61)(better-sqlite3@11.5.0)(expo-sqlite@14.0.6(expo@51.0.36(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0))))(react@18.3.1) + version: 0.33.0(@types/better-sqlite3@7.6.11)(@types/react@18.2.61)(better-sqlite3@11.5.0)(expo-sqlite@14.0.6(expo@51.0.36(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0))(encoding@0.1.13)))(react@18.3.1)(sqlite3@5.1.7) superjson: specifier: ^2.2.1 version: 2.2.1 @@ -2817,6 +2829,9 @@ packages: '@floating-ui/utils@0.2.8': resolution: {integrity: sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==} + '@gar/promisify@1.1.3': + resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} + '@graphql-typed-document-node/core@3.2.0': resolution: {integrity: sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==} peerDependencies: @@ -3133,10 +3148,18 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} + '@npmcli/fs@1.1.1': + resolution: {integrity: sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==} + '@npmcli/fs@3.1.1': resolution: {integrity: sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + '@npmcli/move-file@1.1.2': + resolution: {integrity: sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==} + engines: {node: '>=10'} + deprecated: This functionality has been moved to @npmcli/fs + '@panva/hkdf@1.2.1': resolution: {integrity: sha512-6oclG6Y3PiDFcoyk8srjLfVKyMfVCKJ27JwNPViuXziFpmdz+MZnZN/aKY0JGXgYuO/VghU0jcOAZgWXZ1Dmrw==} @@ -3975,6 +3998,10 @@ packages: peerDependencies: react: ^18 || ^19 + '@tootallnate/once@1.1.2': + resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} + engines: {node: '>= 6'} + '@tootallnate/quickjs-emscripten@0.23.0': resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} @@ -4547,6 +4574,9 @@ packages: '@xtuc/long@4.2.2': resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + abbrev@1.1.1: + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + abort-controller@3.0.0: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} engines: {node: '>=6.5'} @@ -4595,6 +4625,10 @@ packages: resolution: {integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==} engines: {node: '>= 14'} + agentkeepalive@4.5.0: + resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==} + engines: {node: '>= 8.0.0'} + aggregate-error@3.1.0: resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} engines: {node: '>=8'} @@ -4684,6 +4718,14 @@ packages: application-config-path@0.1.1: resolution: {integrity: sha512-zy9cHePtMP0YhwG+CfHm0bgwdnga2X3gZexpdCwEj//dpb+TKajtiC8REEUJUSq6Ab4f9cgNy2l8ObXzCXFkEw==} + aproba@2.0.0: + resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} + + are-we-there-yet@3.0.1: + resolution: {integrity: sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + deprecated: This package is no longer supported. + arg@4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} @@ -5073,6 +5115,10 @@ packages: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} + cacache@15.3.0: + resolution: {integrity: sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==} + engines: {node: '>= 10'} + cacache@18.0.4: resolution: {integrity: sha512-B+L5iIa9mgcjLbliir2th36yEwPftrzteHYujzsx3dFP/31GCHcIeS8f5MGd80odLOjaOvSpU3EEAmRQptkxLQ==} engines: {node: ^16.14.0 || >=18.0.0} @@ -5354,6 +5400,10 @@ packages: color-string@1.9.1: resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + color-support@1.1.3: + resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} + hasBin: true + color@3.2.1: resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} @@ -5463,6 +5513,9 @@ packages: consola@2.15.3: resolution: {integrity: sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==} + console-control-strings@1.1.0: + resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} + constant-case@2.0.0: resolution: {integrity: sha512-eS0N9WwmjTqrOmR3o83F5vW8Z+9R1HnVz3xmzT2PMFug9ly+Au/fxRWlEBSb6LcZwspSsEn9Xs1uw9YgzAg1EQ==} @@ -5836,6 +5889,9 @@ packages: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} + delegates@1.0.0: + resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} + denodeify@1.2.1: resolution: {integrity: sha512-KNTihKNmQENUZeKu5fzfpzRqR5S2VMp4gl9RFHiWzj9DfvYQPMJ6XHKNaQxaGCXwPk6y9yme3aUoaiAe+KX+vg==} @@ -6121,6 +6177,9 @@ packages: encoding-sniffer@0.2.0: resolution: {integrity: sha512-ju7Wq1kg04I3HtiYIOrUrdfdDvkyO9s5XM8QAj/bN61Yo/Vb4vgJxy5vi4Yxk01gWHbrofpPtpxM8bKger9jhg==} + encoding@0.1.13: + resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} + end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} @@ -6143,9 +6202,16 @@ packages: resolution: {integrity: sha512-ObFo8v4rQJAE59M69QzwloxPZtd33TpYEIjtKD1rrFDcM1Gd7IkDxEBU+HriziN6HSHQnBJi8Dmy+JWkav5HKA==} engines: {node: '>=8'} + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + eol@0.9.1: resolution: {integrity: sha512-Ds/TEoZjwggRoz/Q2O7SE3i4Jm66mqTDfmdHdq/7DKVk3bro9Q8h6WdXKdPqFLMoqxrDK5SVRzHVPOS6uuGtrg==} + err-code@2.0.3: + resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} + error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} @@ -6855,6 +6921,11 @@ packages: functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + gauge@4.0.4: + resolution: {integrity: sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + deprecated: This package is no longer supported. + gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} @@ -7097,6 +7168,9 @@ packages: resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} + has-unicode@2.0.1: + resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} + has-yarn@3.0.0: resolution: {integrity: sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -7256,6 +7330,10 @@ packages: http-parser-js@0.5.8: resolution: {integrity: sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==} + http-proxy-agent@4.0.1: + resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==} + engines: {node: '>= 6'} + http-proxy-agent@7.0.0: resolution: {integrity: sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==} engines: {node: '>= 14'} @@ -7297,6 +7375,9 @@ packages: resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} engines: {node: '>=16.17.0'} + humanize-ms@1.2.1: + resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} + hyphenate-style-name@1.1.0: resolution: {integrity: sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw==} @@ -7355,6 +7436,9 @@ packages: resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} engines: {node: '>=8'} + infer-owner@1.0.4: + resolution: {integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==} + infima@0.2.0-alpha.44: resolution: {integrity: sha512-tuRkUSO/lB3rEhLJk25atwAjgLuzq070+pOW8XcvpHky/YbENnRRdPd85IBkyeTgttmOy5ah+yHYsK1HhUd4lQ==} engines: {node: '>=12'} @@ -7570,6 +7654,9 @@ packages: resolution: {integrity: sha512-aZMG0T3F34mTg4eTdszcGXx54oiZ4NtHSft3hWNJMGJXUUqdIj3cOZuHcU0nCWWcY3jd7yRe/3AEm3vSNTpBGQ==} engines: {node: '>=0.10.0'} + is-lambda@1.0.1: + resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} + is-lower-case@1.1.3: resolution: {integrity: sha512-+5A1e/WJpLLXZEDlgz4G//WYSHyQBD32qa4Jd3Lw06qQlv3fJHnp3YIHjTQSGzHMgzmVKz2ZP3rBxTHkPw/lxA==} @@ -8232,6 +8319,10 @@ packages: make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + make-fetch-happen@9.1.0: + resolution: {integrity: sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==} + engines: {node: '>= 10'} + makeerror@1.0.12: resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} @@ -8618,10 +8709,18 @@ packages: minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + minipass-collect@1.0.2: + resolution: {integrity: sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==} + engines: {node: '>= 8'} + minipass-collect@2.0.1: resolution: {integrity: sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==} engines: {node: '>=16 || 14 >=14.17'} + minipass-fetch@1.4.1: + resolution: {integrity: sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==} + engines: {node: '>=8'} + minipass-flush@1.0.5: resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} engines: {node: '>= 8'} @@ -8630,6 +8729,10 @@ packages: resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} engines: {node: '>=8'} + minipass-sized@1.0.3: + resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} + engines: {node: '>=8'} + minipass@3.3.6: resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} engines: {node: '>=8'} @@ -8781,6 +8884,9 @@ packages: node-abort-controller@3.1.1: resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==} + node-addon-api@7.1.1: + resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + node-dir@0.1.17: resolution: {integrity: sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==} engines: {node: '>= 0.10.5'} @@ -8802,6 +8908,11 @@ packages: resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} engines: {node: '>= 6.13.0'} + node-gyp@8.4.1: + resolution: {integrity: sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==} + engines: {node: '>= 10.12.0'} + hasBin: true + node-int64@0.4.0: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} @@ -8818,6 +8929,11 @@ packages: noop-fn@1.0.0: resolution: {integrity: sha512-pQ8vODlgXt2e7A3mIbFDlizkr46r75V+BJxVAyat8Jl7YmI513gG5cfyRL0FedKraoZ+VAouI1h4/IWpus5pcQ==} + nopt@5.0.0: + resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} + engines: {node: '>=6'} + hasBin: true + normalize-package-data@2.5.0: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} @@ -8848,6 +8964,11 @@ packages: resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + npmlog@6.0.2: + resolution: {integrity: sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + deprecated: This package is no longer supported. + nprogress@0.2.0: resolution: {integrity: sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==} @@ -9672,6 +9793,18 @@ packages: resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} engines: {node: '>=0.4.0'} + promise-inflight@1.0.1: + resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} + peerDependencies: + bluebird: '*' + peerDependenciesMeta: + bluebird: + optional: true + + promise-retry@2.0.1: + resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} + engines: {node: '>=10'} + promise@7.3.1: resolution: {integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==} @@ -10198,6 +10331,10 @@ packages: resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} engines: {node: '>=8'} + retry@0.12.0: + resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} + engines: {node: '>= 4'} + retry@0.13.1: resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} engines: {node: '>= 4'} @@ -10375,6 +10512,9 @@ packages: resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} engines: {node: '>= 0.8.0'} + set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + set-function-length@1.1.1: resolution: {integrity: sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==} engines: {node: '>= 0.4'} @@ -10509,6 +10649,10 @@ packages: sockjs@0.3.24: resolution: {integrity: sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==} + socks-proxy-agent@6.2.1: + resolution: {integrity: sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==} + engines: {node: '>= 10'} + socks-proxy-agent@8.0.1: resolution: {integrity: sha512-59EjPbbgg8U3x62hhKOFVAmySQUcfRQ4C7Q/D5sEHnZTQRrQlNKINks44DMR1gwXp0p4LaVIeccX2KHTTcHVqQ==} engines: {node: '>= 14'} @@ -10589,6 +10733,9 @@ packages: sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + sqlite3@5.1.7: + resolution: {integrity: sha512-GGIyOiFaG+TUra3JIfkI/zGP8yZYLPQ0pl1bH+ODjiX57sPhrLU5sQJn1y9bDKZUFYkX1crlrPfSYt0BKKdkog==} + srcset@4.0.0: resolution: {integrity: sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw==} engines: {node: '>=12'} @@ -10597,6 +10744,10 @@ packages: resolution: {integrity: sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + ssri@8.0.1: + resolution: {integrity: sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==} + engines: {node: '>= 8'} + stack-trace@0.0.10: resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} @@ -11268,10 +11419,16 @@ packages: unified@11.0.5: resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} + unique-filename@1.1.1: + resolution: {integrity: sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==} + unique-filename@3.0.0: resolution: {integrity: sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + unique-slug@2.0.2: + resolution: {integrity: sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==} + unique-slug@4.0.0: resolution: {integrity: sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -11707,6 +11864,9 @@ packages: engines: {node: '>=8'} hasBin: true + wide-align@1.1.5: + resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} + widest-line@4.0.1: resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==} engines: {node: '>=12'} @@ -15274,7 +15434,7 @@ snapshots: dependencies: uuid: 8.3.2 - '@expo/cli@0.18.30(expo-modules-autolinking@1.11.3)': + '@expo/cli@0.18.30(encoding@0.1.13)(expo-modules-autolinking@1.11.3)': dependencies: '@babel/runtime': 7.26.0 '@expo/code-signing-certificates': 0.0.5 @@ -15282,17 +15442,17 @@ snapshots: '@expo/config-plugins': 8.0.10 '@expo/devcert': 1.1.4 '@expo/env': 0.3.0 - '@expo/image-utils': 0.5.1 + '@expo/image-utils': 0.5.1(encoding@0.1.13) '@expo/json-file': 8.3.3 '@expo/metro-config': 0.18.11 '@expo/osascript': 2.1.3 '@expo/package-manager': 1.5.2 '@expo/plist': 0.1.3 - '@expo/prebuild-config': 7.0.9(expo-modules-autolinking@1.11.3) - '@expo/rudder-sdk-node': 1.1.1 + '@expo/prebuild-config': 7.0.9(encoding@0.1.13)(expo-modules-autolinking@1.11.3) + '@expo/rudder-sdk-node': 1.1.1(encoding@0.1.13) '@expo/spawn-async': 1.7.2 '@expo/xcpretty': 4.3.1 - '@react-native/dev-middleware': 0.74.85 + '@react-native/dev-middleware': 0.74.85(encoding@0.1.13) '@urql/core': 2.3.6(graphql@15.8.0) '@urql/exchange-retry': 0.3.0(graphql@15.8.0) accepts: 1.3.8 @@ -15324,7 +15484,7 @@ snapshots: lodash.debounce: 4.0.8 md5hex: 1.0.0 minimatch: 3.1.2 - node-fetch: 2.7.0 + node-fetch: 2.7.0(encoding@0.1.13) node-forge: 1.3.1 npm-package-arg: 7.0.0 open: 8.4.2 @@ -15430,14 +15590,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@expo/image-utils@0.5.1': + '@expo/image-utils@0.5.1(encoding@0.1.13)': dependencies: '@expo/spawn-async': 1.7.2 chalk: 4.1.2 fs-extra: 9.0.0 getenv: 1.0.0 jimp-compact: 0.16.1 - node-fetch: 2.7.0 + node-fetch: 2.7.0(encoding@0.1.13) parse-png: 2.1.0 resolve-from: 5.0.0 semver: 7.6.3 @@ -15500,12 +15660,12 @@ snapshots: base64-js: 1.5.1 xmlbuilder: 14.0.0 - '@expo/prebuild-config@7.0.9(expo-modules-autolinking@1.11.3)': + '@expo/prebuild-config@7.0.9(encoding@0.1.13)(expo-modules-autolinking@1.11.3)': dependencies: '@expo/config': 9.0.4 '@expo/config-plugins': 8.0.10 '@expo/config-types': 51.0.3 - '@expo/image-utils': 0.5.1 + '@expo/image-utils': 0.5.1(encoding@0.1.13) '@expo/json-file': 8.3.3 '@react-native/normalize-colors': 0.74.85 debug: 4.3.7 @@ -15518,13 +15678,13 @@ snapshots: - encoding - supports-color - '@expo/rudder-sdk-node@1.1.1': + '@expo/rudder-sdk-node@1.1.1(encoding@0.1.13)': dependencies: '@expo/bunyan': 4.0.1 '@segment/loosely-validate-event': 2.0.0 fetch-retry: 4.1.1 md5: 2.3.0 - node-fetch: 2.7.0 + node-fetch: 2.7.0(encoding@0.1.13) remove-trailing-slash: 0.1.1 uuid: 8.3.2 transitivePeerDependencies: @@ -15572,6 +15732,9 @@ snapshots: '@floating-ui/utils@0.2.8': {} + '@gar/promisify@1.1.3': + optional: true + '@graphql-typed-document-node/core@3.2.0(graphql@15.8.0)': dependencies: graphql: 15.8.0 @@ -15899,10 +16062,22 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.15.0 + '@npmcli/fs@1.1.1': + dependencies: + '@gar/promisify': 1.1.3 + semver: 7.6.3 + optional: true + '@npmcli/fs@3.1.1': dependencies: semver: 7.6.3 + '@npmcli/move-file@1.1.2': + dependencies: + mkdirp: 1.0.4 + rimraf: 3.0.2 + optional: true + '@panva/hkdf@1.2.1': {} '@paralleldrive/cuid2@2.2.2': @@ -16535,7 +16710,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@react-native/community-cli-plugin@0.76.2(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0))': + '@react-native/community-cli-plugin@0.76.2(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0))(encoding@0.1.13)': dependencies: '@react-native/dev-middleware': 0.76.2 '@react-native/metro-babel-transformer': 0.76.2(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0)) @@ -16545,7 +16720,7 @@ snapshots: metro: 0.81.0 metro-config: 0.81.0 metro-core: 0.81.0 - node-fetch: 2.7.0 + node-fetch: 2.7.0(encoding@0.1.13) readline: 1.3.0 semver: 7.6.3 transitivePeerDependencies: @@ -16560,7 +16735,7 @@ snapshots: '@react-native/debugger-frontend@0.76.2': {} - '@react-native/dev-middleware@0.74.85': + '@react-native/dev-middleware@0.74.85(encoding@0.1.13)': dependencies: '@isaacs/ttlcache': 1.4.1 '@react-native/debugger-frontend': 0.74.85 @@ -16568,7 +16743,7 @@ snapshots: chrome-launcher: 0.15.2 connect: 3.7.0 debug: 2.6.9 - node-fetch: 2.7.0 + node-fetch: 2.7.0(encoding@0.1.13) nullthrows: 1.1.1 open: 7.4.2 selfsigned: 2.4.1 @@ -16617,12 +16792,12 @@ snapshots: '@react-native/normalize-colors@0.76.2': {} - '@react-native/virtualized-lists@0.76.2(@types/react@18.2.61)(react-native@0.76.2(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0))(@types/react@18.2.61)(react@18.3.1))(react@18.3.1)': + '@react-native/virtualized-lists@0.76.2(@types/react@18.2.61)(react-native@0.76.2(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0))(@types/react@18.2.61)(encoding@0.1.13)(react@18.3.1))(react@18.3.1)': dependencies: invariant: 2.2.4 nullthrows: 1.1.1 react: 18.3.1 - react-native: 0.76.2(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0))(@types/react@18.2.61)(react@18.3.1) + react-native: 0.76.2(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0))(@types/react@18.2.61)(encoding@0.1.13)(react@18.3.1) optionalDependencies: '@types/react': 18.2.61 @@ -16937,6 +17112,9 @@ snapshots: '@tanstack/query-core': 5.59.20 react: 18.3.1 + '@tootallnate/once@1.1.2': + optional: true + '@tootallnate/quickjs-emscripten@0.23.0': {} '@trpc/client@11.0.0-next-beta.308(@trpc/server@11.0.0-next-beta.308)': @@ -17410,7 +17588,7 @@ snapshots: debug: 4.3.7 globby: 11.1.0 is-glob: 4.0.3 - semver: 7.5.4 + semver: 7.6.3 tsutils: 3.21.0(typescript@5.3.3) optionalDependencies: typescript: 5.3.3 @@ -17704,6 +17882,9 @@ snapshots: '@xtuc/long@4.2.2': {} + abbrev@1.1.1: + optional: true + abort-controller@3.0.0: dependencies: event-target-shim: 5.0.1 @@ -17745,6 +17926,11 @@ snapshots: transitivePeerDependencies: - supports-color + agentkeepalive@4.5.0: + dependencies: + humanize-ms: 1.2.1 + optional: true + aggregate-error@3.1.0: dependencies: clean-stack: 2.2.0 @@ -17839,6 +18025,15 @@ snapshots: application-config-path@0.1.1: {} + aproba@2.0.0: + optional: true + + are-we-there-yet@3.0.1: + dependencies: + delegates: 1.0.0 + readable-stream: 3.6.2 + optional: true + arg@4.1.3: {} arg@5.0.2: {} @@ -18367,6 +18562,30 @@ snapshots: cac@6.7.14: {} + cacache@15.3.0: + dependencies: + '@npmcli/fs': 1.1.1 + '@npmcli/move-file': 1.1.2 + chownr: 2.0.0 + fs-minipass: 2.1.0 + glob: 7.2.3 + infer-owner: 1.0.4 + lru-cache: 6.0.0 + minipass: 3.3.6 + minipass-collect: 1.0.2 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + mkdirp: 1.0.4 + p-map: 4.0.0 + promise-inflight: 1.0.1 + rimraf: 3.0.2 + ssri: 8.0.1 + tar: 6.2.1 + unique-filename: 1.1.1 + transitivePeerDependencies: + - bluebird + optional: true + cacache@18.0.4: dependencies: '@npmcli/fs': 3.1.1 @@ -18697,6 +18916,9 @@ snapshots: color-name: 1.1.4 simple-swizzle: 0.2.2 + color-support@1.1.3: + optional: true + color@3.2.1: dependencies: color-convert: 1.9.3 @@ -18804,6 +19026,9 @@ snapshots: consola@2.15.3: {} + console-control-strings@1.1.0: + optional: true + constant-case@2.0.0: dependencies: snake-case: 2.1.0 @@ -18898,9 +19123,9 @@ snapshots: create-require@1.1.1: {} - cross-fetch@3.1.8: + cross-fetch@3.1.8(encoding@0.1.13): dependencies: - node-fetch: 2.7.0 + node-fetch: 2.7.0(encoding@0.1.13) transitivePeerDependencies: - encoding @@ -19263,6 +19488,9 @@ snapshots: delayed-stream@1.0.0: {} + delegates@1.0.0: + optional: true + denodeify@1.2.1: {} depd@1.1.2: {} @@ -19400,13 +19628,14 @@ snapshots: transitivePeerDependencies: - supports-color - drizzle-orm@0.33.0(@types/better-sqlite3@7.6.11)(@types/react@18.2.61)(better-sqlite3@11.5.0)(expo-sqlite@14.0.6(expo@51.0.36(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0))))(react@18.3.1): + drizzle-orm@0.33.0(@types/better-sqlite3@7.6.11)(@types/react@18.2.61)(better-sqlite3@11.5.0)(expo-sqlite@14.0.6(expo@51.0.36(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0))(encoding@0.1.13)))(react@18.3.1)(sqlite3@5.1.7): optionalDependencies: '@types/better-sqlite3': 7.6.11 '@types/react': 18.2.61 better-sqlite3: 11.5.0 - expo-sqlite: 14.0.6(expo@51.0.36(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0))) + expo-sqlite: 14.0.6(expo@51.0.36(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0))(encoding@0.1.13)) react: 18.3.1 + sqlite3: 5.1.7 duplexer@0.1.2: {} @@ -19447,6 +19676,11 @@ snapshots: iconv-lite: 0.6.3 whatwg-encoding: 3.1.1 + encoding@0.1.13: + dependencies: + iconv-lite: 0.6.3 + optional: true + end-of-stream@1.4.4: dependencies: once: 1.4.0 @@ -19467,8 +19701,14 @@ snapshots: env-editor@0.4.2: {} + env-paths@2.2.1: + optional: true + eol@0.9.1: {} + err-code@2.0.3: + optional: true + error-ex@1.3.2: dependencies: is-arrayish: 0.2.1 @@ -20188,35 +20428,35 @@ snapshots: expect-type@1.1.0: {} - expo-asset@10.0.10(expo@51.0.36(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0))): + expo-asset@10.0.10(expo@51.0.36(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0))(encoding@0.1.13)): dependencies: - expo: 51.0.36(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0)) - expo-constants: 16.0.2(expo@51.0.36(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0))) + expo: 51.0.36(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0))(encoding@0.1.13) + expo-constants: 16.0.2(expo@51.0.36(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0))(encoding@0.1.13)) invariant: 2.2.4 md5-file: 3.2.3 transitivePeerDependencies: - supports-color - expo-constants@16.0.2(expo@51.0.36(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0))): + expo-constants@16.0.2(expo@51.0.36(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0))(encoding@0.1.13)): dependencies: '@expo/config': 9.0.4 '@expo/env': 0.3.0 - expo: 51.0.36(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0)) + expo: 51.0.36(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0))(encoding@0.1.13) transitivePeerDependencies: - supports-color - expo-file-system@17.0.1(expo@51.0.36(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0))): + expo-file-system@17.0.1(expo@51.0.36(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0))(encoding@0.1.13)): dependencies: - expo: 51.0.36(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0)) + expo: 51.0.36(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0))(encoding@0.1.13) - expo-font@12.0.10(expo@51.0.36(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0))): + expo-font@12.0.10(expo@51.0.36(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0))(encoding@0.1.13)): dependencies: - expo: 51.0.36(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0)) + expo: 51.0.36(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0))(encoding@0.1.13) fontfaceobserver: 2.3.0 - expo-keep-awake@13.0.2(expo@51.0.36(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0))): + expo-keep-awake@13.0.2(expo@51.0.36(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0))(encoding@0.1.13)): dependencies: - expo: 51.0.36(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0)) + expo: 51.0.36(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0))(encoding@0.1.13) expo-modules-autolinking@1.11.3: dependencies: @@ -20232,27 +20472,27 @@ snapshots: dependencies: invariant: 2.2.4 - expo-sqlite@14.0.6(expo@51.0.36(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0))): + expo-sqlite@14.0.6(expo@51.0.36(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0))(encoding@0.1.13)): dependencies: '@expo/websql': 1.0.1 - expo: 51.0.36(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0)) + expo: 51.0.36(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0))(encoding@0.1.13) - expo@51.0.36(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0)): + expo@51.0.36(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0))(encoding@0.1.13): dependencies: '@babel/runtime': 7.26.0 - '@expo/cli': 0.18.30(expo-modules-autolinking@1.11.3) + '@expo/cli': 0.18.30(encoding@0.1.13)(expo-modules-autolinking@1.11.3) '@expo/config': 9.0.4 '@expo/config-plugins': 8.0.10 '@expo/metro-config': 0.18.11 '@expo/vector-icons': 14.0.4 babel-preset-expo: 11.0.15(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0)) - expo-asset: 10.0.10(expo@51.0.36(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0))) - expo-file-system: 17.0.1(expo@51.0.36(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0))) - expo-font: 12.0.10(expo@51.0.36(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0))) - expo-keep-awake: 13.0.2(expo@51.0.36(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0))) + expo-asset: 10.0.10(expo@51.0.36(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0))(encoding@0.1.13)) + expo-file-system: 17.0.1(expo@51.0.36(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0))(encoding@0.1.13)) + expo-font: 12.0.10(expo@51.0.36(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0))(encoding@0.1.13)) + expo-keep-awake: 13.0.2(expo@51.0.36(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0))(encoding@0.1.13)) expo-modules-autolinking: 1.11.3 expo-modules-core: 1.12.25 - fbemitter: 3.0.0 + fbemitter: 3.0.0(encoding@0.1.13) whatwg-url-without-unicode: 8.0.0-3 transitivePeerDependencies: - '@babel/core' @@ -20364,17 +20604,17 @@ snapshots: dependencies: bser: 2.1.1 - fbemitter@3.0.0: + fbemitter@3.0.0(encoding@0.1.13): dependencies: - fbjs: 3.0.5 + fbjs: 3.0.5(encoding@0.1.13) transitivePeerDependencies: - encoding fbjs-css-vars@1.0.2: {} - fbjs@3.0.5: + fbjs@3.0.5(encoding@0.1.13): dependencies: - cross-fetch: 3.1.8 + cross-fetch: 3.1.8(encoding@0.1.13) fbjs-css-vars: 1.0.2 loose-envify: 1.4.0 object-assign: 4.1.1 @@ -20623,6 +20863,18 @@ snapshots: functions-have-names@1.2.3: {} + gauge@4.0.4: + dependencies: + aproba: 2.0.0 + color-support: 1.1.3 + console-control-strings: 1.1.0 + has-unicode: 2.0.1 + signal-exit: 3.0.7 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wide-align: 1.1.5 + optional: true + gensync@1.0.0-beta.2: {} get-caller-file@2.0.5: {} @@ -20898,6 +21150,9 @@ snapshots: dependencies: has-symbols: 1.0.3 + has-unicode@2.0.1: + optional: true + has-yarn@3.0.0: {} hasown@2.0.0: @@ -21155,6 +21410,15 @@ snapshots: http-parser-js@0.5.8: {} + http-proxy-agent@4.0.1: + dependencies: + '@tootallnate/once': 1.1.2 + agent-base: 6.0.2 + debug: 4.3.7 + transitivePeerDependencies: + - supports-color + optional: true + http-proxy-agent@7.0.0: dependencies: agent-base: 7.1.0 @@ -21207,6 +21471,11 @@ snapshots: human-signals@5.0.0: {} + humanize-ms@1.2.1: + dependencies: + ms: 2.1.3 + optional: true + hyphenate-style-name@1.1.0: {} iconv-lite@0.4.24: @@ -21251,6 +21520,9 @@ snapshots: indent-string@4.0.0: {} + infer-owner@1.0.4: + optional: true + infima@0.2.0-alpha.44: {} inflight@1.0.6: @@ -21465,6 +21737,9 @@ snapshots: dependencies: is-glob: 2.0.1 + is-lambda@1.0.1: + optional: true + is-lower-case@1.1.3: dependencies: lower-case: 1.1.4 @@ -22105,6 +22380,29 @@ snapshots: make-error@1.3.6: {} + make-fetch-happen@9.1.0: + dependencies: + agentkeepalive: 4.5.0 + cacache: 15.3.0 + http-cache-semantics: 4.1.1 + http-proxy-agent: 4.0.1 + https-proxy-agent: 5.0.1 + is-lambda: 1.0.1 + lru-cache: 6.0.0 + minipass: 3.3.6 + minipass-collect: 1.0.2 + minipass-fetch: 1.4.1 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + negotiator: 0.6.3 + promise-retry: 2.0.1 + socks-proxy-agent: 6.2.1 + ssri: 8.0.1 + transitivePeerDependencies: + - bluebird + - supports-color + optional: true + makeerror@1.0.12: dependencies: tmpl: 1.0.5 @@ -22888,10 +23186,24 @@ snapshots: minimist@1.2.8: {} + minipass-collect@1.0.2: + dependencies: + minipass: 3.3.6 + optional: true + minipass-collect@2.0.1: dependencies: minipass: 7.1.2 + minipass-fetch@1.4.1: + dependencies: + minipass: 3.3.6 + minipass-sized: 1.0.3 + minizlib: 2.1.2 + optionalDependencies: + encoding: 0.1.13 + optional: true + minipass-flush@1.0.5: dependencies: minipass: 3.3.6 @@ -22900,6 +23212,11 @@ snapshots: dependencies: minipass: 3.3.6 + minipass-sized@1.0.3: + dependencies: + minipass: 3.3.6 + optional: true + minipass@3.3.6: dependencies: yallist: 4.0.0 @@ -22955,11 +23272,11 @@ snapshots: napi-build-utils@1.0.2: {} - nativewind@4.1.23(react-native-reanimated@3.16.1(@babel/core@7.26.0)(react-native@0.76.2(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0))(@types/react@18.2.61)(react@18.3.1))(react@18.3.1))(react-native@0.76.2(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0))(@types/react@18.2.61)(react@18.3.1))(react@18.3.1)(tailwindcss@3.4.15(ts-node@10.9.1(@types/node@20.11.24)(typescript@5.6.3))): + nativewind@4.1.23(react-native-reanimated@3.16.1(@babel/core@7.26.0)(react-native@0.76.2(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0))(@types/react@18.2.61)(encoding@0.1.13)(react@18.3.1))(react@18.3.1))(react-native@0.76.2(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0))(@types/react@18.2.61)(encoding@0.1.13)(react@18.3.1))(react@18.3.1)(tailwindcss@3.4.15(ts-node@10.9.1(@types/node@20.11.24)(typescript@5.6.3))): dependencies: comment-json: 4.2.5 debug: 4.3.7 - react-native-css-interop: 0.1.22(react-native-reanimated@3.16.1(@babel/core@7.26.0)(react-native@0.76.2(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0))(@types/react@18.2.61)(react@18.3.1))(react@18.3.1))(react-native@0.76.2(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0))(@types/react@18.2.61)(react@18.3.1))(react@18.3.1)(tailwindcss@3.4.15(ts-node@10.9.1(@types/node@20.11.24)(typescript@5.6.3))) + react-native-css-interop: 0.1.22(react-native-reanimated@3.16.1(@babel/core@7.26.0)(react-native@0.76.2(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0))(@types/react@18.2.61)(encoding@0.1.13)(react@18.3.1))(react@18.3.1))(react-native@0.76.2(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0))(@types/react@18.2.61)(encoding@0.1.13)(react@18.3.1))(react@18.3.1)(tailwindcss@3.4.15(ts-node@10.9.1(@types/node@20.11.24)(typescript@5.6.3))) tailwindcss: 3.4.15(ts-node@10.9.1(@types/node@20.11.24)(typescript@5.6.3)) transitivePeerDependencies: - react @@ -23059,6 +23376,8 @@ snapshots: node-abort-controller@3.1.1: {} + node-addon-api@7.1.1: {} + node-dir@0.1.17: dependencies: minimatch: 3.1.2 @@ -23070,12 +23389,31 @@ snapshots: emojilib: 2.4.0 skin-tone: 2.0.0 - node-fetch@2.7.0: + node-fetch@2.7.0(encoding@0.1.13): dependencies: whatwg-url: 5.0.0 + optionalDependencies: + encoding: 0.1.13 node-forge@1.3.1: {} + node-gyp@8.4.1: + dependencies: + env-paths: 2.2.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + make-fetch-happen: 9.1.0 + nopt: 5.0.0 + npmlog: 6.0.2 + rimraf: 3.0.2 + semver: 7.6.3 + tar: 6.2.1 + which: 2.0.2 + transitivePeerDependencies: + - bluebird + - supports-color + optional: true + node-int64@0.4.0: {} node-plop@0.26.3: @@ -23098,6 +23436,11 @@ snapshots: noop-fn@1.0.0: {} + nopt@5.0.0: + dependencies: + abbrev: 1.1.1 + optional: true + normalize-package-data@2.5.0: dependencies: hosted-git-info: 2.8.9 @@ -23130,6 +23473,14 @@ snapshots: dependencies: path-key: 4.0.0 + npmlog@6.0.2: + dependencies: + are-we-there-yet: 3.0.1 + console-control-strings: 1.1.0 + gauge: 4.0.4 + set-blocking: 2.0.0 + optional: true + nprogress@0.2.0: {} nth-check@2.1.1: @@ -23500,7 +23851,7 @@ snapshots: path-scurry@1.10.1: dependencies: lru-cache: 10.4.3 - minipass: 7.0.4 + minipass: 7.1.2 path-scurry@1.11.1: dependencies: @@ -24065,6 +24416,15 @@ snapshots: progress@2.0.3: {} + promise-inflight@1.0.1: + optional: true + + promise-retry@2.0.1: + dependencies: + err-code: 2.0.3 + retry: 0.12.0 + optional: true + promise@7.3.1: dependencies: asap: 2.0.6 @@ -24296,7 +24656,7 @@ snapshots: dependencies: react: 18.3.1 - react-native-css-interop@0.1.22(react-native-reanimated@3.16.1(@babel/core@7.26.0)(react-native@0.76.2(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0))(@types/react@18.2.61)(react@18.3.1))(react@18.3.1))(react-native@0.76.2(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0))(@types/react@18.2.61)(react@18.3.1))(react@18.3.1)(tailwindcss@3.4.15(ts-node@10.9.1(@types/node@20.11.24)(typescript@5.6.3))): + react-native-css-interop@0.1.22(react-native-reanimated@3.16.1(@babel/core@7.26.0)(react-native@0.76.2(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0))(@types/react@18.2.61)(encoding@0.1.13)(react@18.3.1))(react@18.3.1))(react-native@0.76.2(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0))(@types/react@18.2.61)(encoding@0.1.13)(react@18.3.1))(react@18.3.1)(tailwindcss@3.4.15(ts-node@10.9.1(@types/node@20.11.24)(typescript@5.6.3))): dependencies: '@babel/helper-module-imports': 7.25.9 '@babel/traverse': 7.25.9 @@ -24304,14 +24664,14 @@ snapshots: debug: 4.3.7 lightningcss: 1.28.1 react: 18.3.1 - react-native: 0.76.2(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0))(@types/react@18.2.61)(react@18.3.1) - react-native-reanimated: 3.16.1(@babel/core@7.26.0)(react-native@0.76.2(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0))(@types/react@18.2.61)(react@18.3.1))(react@18.3.1) + react-native: 0.76.2(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0))(@types/react@18.2.61)(encoding@0.1.13)(react@18.3.1) + react-native-reanimated: 3.16.1(@babel/core@7.26.0)(react-native@0.76.2(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0))(@types/react@18.2.61)(encoding@0.1.13)(react@18.3.1))(react@18.3.1) semver: 7.6.3 tailwindcss: 3.4.15(ts-node@10.9.1(@types/node@20.11.24)(typescript@5.6.3)) transitivePeerDependencies: - supports-color - react-native-reanimated@3.16.1(@babel/core@7.26.0)(react-native@0.76.2(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0))(@types/react@18.2.61)(react@18.3.1))(react@18.3.1): + react-native-reanimated@3.16.1(@babel/core@7.26.0)(react-native@0.76.2(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0))(@types/react@18.2.61)(encoding@0.1.13)(react@18.3.1))(react@18.3.1): dependencies: '@babel/core': 7.26.0 '@babel/plugin-transform-arrow-functions': 7.25.9(@babel/core@7.26.0) @@ -24326,15 +24686,15 @@ snapshots: convert-source-map: 2.0.0 invariant: 2.2.4 react: 18.3.1 - react-native: 0.76.2(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0))(@types/react@18.2.61)(react@18.3.1) + react-native: 0.76.2(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0))(@types/react@18.2.61)(encoding@0.1.13)(react@18.3.1) transitivePeerDependencies: - supports-color - react-native-web@0.19.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + react-native-web@0.19.13(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.26.0 '@react-native/normalize-colors': 0.74.85 - fbjs: 3.0.5 + fbjs: 3.0.5(encoding@0.1.13) inline-style-prefixer: 6.0.4 memoize-one: 6.0.0 nullthrows: 1.1.1 @@ -24345,16 +24705,16 @@ snapshots: transitivePeerDependencies: - encoding - react-native@0.76.2(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0))(@types/react@18.2.61)(react@18.3.1): + react-native@0.76.2(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0))(@types/react@18.2.61)(encoding@0.1.13)(react@18.3.1): dependencies: '@jest/create-cache-key-function': 29.7.0 '@react-native/assets-registry': 0.76.2 '@react-native/codegen': 0.76.2(@babel/preset-env@7.25.7(@babel/core@7.26.0)) - '@react-native/community-cli-plugin': 0.76.2(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0)) + '@react-native/community-cli-plugin': 0.76.2(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0))(encoding@0.1.13) '@react-native/gradle-plugin': 0.76.2 '@react-native/js-polyfills': 0.76.2 '@react-native/normalize-colors': 0.76.2 - '@react-native/virtualized-lists': 0.76.2(@types/react@18.2.61)(react-native@0.76.2(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0))(@types/react@18.2.61)(react@18.3.1))(react@18.3.1) + '@react-native/virtualized-lists': 0.76.2(@types/react@18.2.61)(react-native@0.76.2(@babel/core@7.26.0)(@babel/preset-env@7.25.7(@babel/core@7.26.0))(@types/react@18.2.61)(encoding@0.1.13)(react@18.3.1))(react@18.3.1) abort-controller: 3.0.0 anser: 1.4.10 ansi-regex: 5.0.1 @@ -24797,6 +25157,9 @@ snapshots: onetime: 5.1.2 signal-exit: 3.0.7 + retry@0.12.0: + optional: true + retry@0.13.1: {} reusify@1.0.4: {} @@ -25046,6 +25409,9 @@ snapshots: transitivePeerDependencies: - supports-color + set-blocking@2.0.0: + optional: true + set-function-length@1.1.1: dependencies: define-data-property: 1.1.1 @@ -25218,6 +25584,15 @@ snapshots: uuid: 8.3.2 websocket-driver: 0.7.4 + socks-proxy-agent@6.2.1: + dependencies: + agent-base: 6.0.2 + debug: 4.3.7 + socks: 2.7.1 + transitivePeerDependencies: + - supports-color + optional: true + socks-proxy-agent@8.0.1: dependencies: agent-base: 7.1.0 @@ -25311,12 +25686,29 @@ snapshots: sprintf-js@1.0.3: {} + sqlite3@5.1.7: + dependencies: + bindings: 1.5.0 + node-addon-api: 7.1.1 + prebuild-install: 7.1.2 + tar: 6.2.1 + optionalDependencies: + node-gyp: 8.4.1 + transitivePeerDependencies: + - bluebird + - supports-color + srcset@4.0.0: {} ssri@10.0.6: dependencies: minipass: 7.1.2 + ssri@8.0.1: + dependencies: + minipass: 3.3.6 + optional: true + stack-trace@0.0.10: {} stack-utils@2.0.6: @@ -26030,10 +26422,20 @@ snapshots: trough: 2.2.0 vfile: 6.0.3 + unique-filename@1.1.1: + dependencies: + unique-slug: 2.0.2 + optional: true + unique-filename@3.0.0: dependencies: unique-slug: 4.0.0 + unique-slug@2.0.2: + dependencies: + imurmurhash: 0.1.4 + optional: true + unique-slug@4.0.0: dependencies: imurmurhash: 0.1.4 @@ -26597,6 +26999,11 @@ snapshots: siginfo: 2.0.0 stackback: 0.0.2 + wide-align@1.1.5: + dependencies: + string-width: 4.2.3 + optional: true + widest-line@4.0.1: dependencies: string-width: 5.1.2 diff --git a/scripts/create_user.sh b/scripts/create_user.sh new file mode 100755 index 0000000..48b4c99 --- /dev/null +++ b/scripts/create_user.sh @@ -0,0 +1,93 @@ +#!/usr/bin/env node + +const sqlite3 = require('sqlite3').verbose(); +const fs = require('fs'); + +// Read JSON files +const users = JSON.parse(fs.readFileSync('user.json')); +const apikeys = JSON.parse(fs.readFileSync('apikey.json')); +const colors = JSON.parse(fs.readFileSync('color.json')); +const categories = JSON.parse(fs.readFileSync('category.json')); + +// Connect to SQLite +const db = new sqlite3.Database('/home/ryan/Notes/lifetracker/lifetracker.db'); + +// Helper function to insert data +const insertData = (table, columns, values) => { + const placeholders = columns.map(() => '?').join(', '); + const sql = `INSERT INTO ${table} (${columns.join(', ')}) VALUES (${placeholders})`; + db.run(sql, values, (err) => { + if (err) { + console.error(`Error inserting into ${table}:`, err.message); + } + }); +}; + +// Insert users +users.forEach(user => { + insertData( + 'user', + ['id', 'name', 'email', 'emailVerified', 'image', 'password', 'role'], + [ + user.id, + user.name, + user.email, + user.emailVerified || null, + user.image || null, + user.password, + user.role || 'user' + ] + ); +}); + +// Insert API keys +apiKeys.forEach(apiKey => { + insertData( + 'apiKey', + ['id', 'keyHash', 'keyId', 'name', 'userId', 'createdAt'], + [ + apiKey.id, + apiKey.keyHash, + apiKey.keyId, + apiKey.name, + apiKey.userId, + apiKey.createdAt || new Date().toISOString() + ] + ); +}); +categories.forEach(category => { + insertData( + 'category', + ['id', 'code', 'colorId', 'createdAt', 'description', 'name', 'parentId', 'userId'], + [ + category.id, + category.code, + category.colorId || null, + category.createdAt || new Date().toISOString(), + category.description || null, + category.name, + category.parentId || null, + category.userId + ] + ); +}); + +colors.forEach(color => { + insertData( + 'color', + ['id', 'name', 'hexcode', 'inverse', 'userId', 'createdAt'], + [ + color.id, + color.name, + color.hexcode, + color.inverse || null, + color.userId, + color.createdAt || new Date().toISOString() + ] + ); +}); + +// Close the connection +db.close(() => { + console.log('Database population completed!'); +});