resetting

This commit is contained in:
2026-06-03 13:54:53 -04:00
parent 61d48d3648
commit 203591ca05
6 changed files with 306 additions and 11281 deletions

1205
bun.lock

File diff suppressed because it is too large Load Diff

10232
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,3 +0,0 @@
packages:
- "web"
- "browser-ext"

View File

@@ -15,56 +15,25 @@
"benchmark:spamshield": "tsx src/server/services/spamshield/benchmark.ts"
},
"dependencies": {
"@libsql/client": "^0.15.0",
"@sentry/solidstart": "^10.54.0",
"@solidjs/meta": "^0.29.4",
"@libsql/client": "^0.17.3",
"@sentry/solidstart": "^10.56.0",
"@solidjs/router": "^0.15.0",
"@solidjs/start": "2.0.0-alpha.2",
"@solidjs/vite-plugin-nitro-2": "^0.1.0",
"@stripe/stripe-js": "^9.6.0",
"@tailwindcss/vite": "^4.0.0",
"@trpc/client": "^10.45.2",
"@trpc/server": "^10.45.2",
"@types/three": "^0.184.1",
"@typeschema/valibot": "^0.13.4",
"@stripe/stripe-js": "^9.7.0",
"@trpc/client": "^11.17.0",
"@trpc/server": "^11.17.0",
"bcryptjs": "^3.0.3",
"bullmq": "^5.77.3",
"clerk-solidjs": "^2.0.10",
"dompurify": "^3.4.7",
"drizzle-orm": "^0.45.2",
"firebase-admin": "^13.10.0",
"imapflow": "^1.3.4",
"ioredis": "^5.10.1",
"isomorphic-dompurify": "^3.15.0",
"jose": "^5",
"marked": "^18.0.4",
"node-cron": "^4.2.1",
"onnxruntime-node": "^1.26.0",
"pino": "^10.3.1",
"pino-pretty": "^13.1.3",
"puppeteer": "^25.0.4",
"resend": "^6.12.4",
"solid-js": "^1.9.5",
"stripe": "^22.1.1",
"tailwindcss": "^4.0.0",
"three": "^0.184.0",
"twilio": "^6.0.2",
"valibot": "^0.29.0",
"vite": "^7.0.0",
"ws": "^8.21.0"
"vite": "^7.0.0"
},
"engines": {
"node": ">=22"
},
"devDependencies": {
"@playwright/test": "^1.60.0",
"@types/node-cron": "^3.0.11",
"@types/ws": "^8.18.1",
"drizzle-kit": "^0.31.10",
"jsdom": "^29.1.1",
"playwright": "^1.60.0",
"tsx": "^4.22.3",
"vite-plugin-solid": "^2.11.12",
"vitest": "^4.1.5"
"@tailwindcss/vite": "^4.0.7",
"tailwindcss": "^4.0.7"
}
}

View File

@@ -1,40 +1,84 @@
import { sqliteTable, text, integer, uniqueIndex, index } from "drizzle-orm/sqlite-core";
import {
sqliteTable,
text,
integer,
uniqueIndex,
index,
} from "drizzle-orm/sqlite-core";
import { familyGroupMembers } from "./subscription";
export { familyGroupMembers };
/**
* Per-member service configuration.
* The primary account holder assigns which services each member gets.
* Default: all members get darkwatch + spamshield + removebrokers.
* HomeTitle and VoicePrint limited by property/voice enrollment slots.
*/
export const familyMemberServices = sqliteTable("family_member_services", {
id: text("id").primaryKey().$defaultFn(() => crypto.randomUUID()),
memberId: text("member_id").notNull().references(() => familyGroupMembers.id, { onDelete: "cascade" }),
service: text("service").notNull(),
enabled: integer("enabled", { mode: "boolean" }).default(true).notNull(),
configuredBy: text("configured_by").notNull(),
configuredAt: integer("configured_at", { mode: "timestamp_ms" }).defaultNow().notNull(),
createdAt: integer("created_at", { mode: "timestamp_ms" }).defaultNow().notNull(),
updatedAt: integer("updated_at", { mode: "timestamp_ms" }).defaultNow().notNull().$onUpdate(() => new Date()),
}, (table) => ({
memberServiceUnique: uniqueIndex("family_member_services_member_service_unique").on(table.memberId, table.service),
memberIdIdx: index("family_member_services_member_id_idx").on(table.memberId),
serviceIdx: index("family_member_services_service_idx").on(table.service),
}));
export const familyMemberServices = sqliteTable(
"family_member_services",
{
id: text("id")
.primaryKey()
.$defaultFn(() => crypto.randomUUID()),
memberId: text("member_id")
.notNull()
.references(() => familyGroupMembers.id, { onDelete: "cascade" }),
service: text("service").notNull(),
enabled: integer("enabled", { mode: "boolean" }).default(true).notNull(),
configuredBy: text("configured_by").notNull(),
configuredAt: integer("configured_at", { mode: "timestamp_ms" })
.defaultNow()
.notNull(),
createdAt: integer("created_at", { mode: "timestamp_ms" })
.defaultNow()
.notNull(),
updatedAt: integer("updated_at", { mode: "timestamp_ms" })
.defaultNow()
.notNull()
.$onUpdate(() => new Date()),
},
(table) => ({
memberServiceUnique: uniqueIndex(
"family_member_services_member_service_unique",
).on(table.memberId, table.service),
memberIdIdx: index("family_member_services_member_id_idx").on(
table.memberId,
),
serviceIdx: index("family_member_services_service_idx").on(table.service),
}),
);
/**
* Per-member alert notification preferences.
* Members can opt into/off specific alert types and channels.
*/
export const familyMemberAlertPreferences = sqliteTable("family_member_alert_preferences", {
id: text("id").primaryKey().$defaultFn(() => crypto.randomUUID()),
memberId: text("member_id").notNull().references(() => familyGroupMembers.id, { onDelete: "cascade" }),
alertType: text("alert_type").notNull(),
channel: text("channel").notNull(),
enabled: integer("enabled", { mode: "boolean" }).default(true).notNull(),
createdAt: integer("created_at", { mode: "timestamp_ms" }).defaultNow().notNull(),
updatedAt: integer("updated_at", { mode: "timestamp_ms" }).defaultNow().notNull().$onUpdate(() => new Date()),
}, (table) => ({
memberChannelTypeUnique: uniqueIndex("family_member_alert_prefs_member_channel_type_unique").on(table.memberId, table.channel, table.alertType),
memberIdIdx: index("family_member_alert_prefs_member_id_idx").on(table.memberId),
}));
export const familyMemberAlertPreferences = sqliteTable(
"family_member_alert_preferences",
{
id: text("id")
.primaryKey()
.$defaultFn(() => crypto.randomUUID()),
memberId: text("member_id")
.notNull()
.references(() => familyGroupMembers.id, { onDelete: "cascade" }),
alertType: text("alert_type").notNull(),
channel: text("channel").notNull(),
enabled: integer("enabled", { mode: "boolean" }).default(true).notNull(),
createdAt: integer("created_at", { mode: "timestamp_ms" })
.defaultNow()
.notNull(),
updatedAt: integer("updated_at", { mode: "timestamp_ms" })
.defaultNow()
.notNull()
.$onUpdate(() => new Date()),
},
(table) => ({
memberChannelTypeUnique: uniqueIndex(
"family_member_alert_prefs_member_channel_type_unique",
).on(table.memberId, table.channel, table.alertType),
memberIdIdx: index("family_member_alert_prefs_member_id_idx").on(
table.memberId,
),
}),
);

View File

@@ -2,7 +2,7 @@
"$schema": "https://openapi.vercel.sh/vercel.json",
"framework": "solidstart",
"buildCommand": "npm run build",
"installCommand": "npm install",
"installCommand": "bun install",
"outputDirectory": ".output/public",
"regions": ["iad1"]
}