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" "benchmark:spamshield": "tsx src/server/services/spamshield/benchmark.ts"
}, },
"dependencies": { "dependencies": {
"@libsql/client": "^0.15.0", "@libsql/client": "^0.17.3",
"@sentry/solidstart": "^10.54.0", "@sentry/solidstart": "^10.56.0",
"@solidjs/meta": "^0.29.4",
"@solidjs/router": "^0.15.0", "@solidjs/router": "^0.15.0",
"@solidjs/start": "2.0.0-alpha.2", "@solidjs/start": "2.0.0-alpha.2",
"@solidjs/vite-plugin-nitro-2": "^0.1.0", "@solidjs/vite-plugin-nitro-2": "^0.1.0",
"@stripe/stripe-js": "^9.6.0", "@stripe/stripe-js": "^9.7.0",
"@tailwindcss/vite": "^4.0.0", "@trpc/client": "^11.17.0",
"@trpc/client": "^10.45.2", "@trpc/server": "^11.17.0",
"@trpc/server": "^10.45.2",
"@types/three": "^0.184.1",
"@typeschema/valibot": "^0.13.4",
"bcryptjs": "^3.0.3", "bcryptjs": "^3.0.3",
"bullmq": "^5.77.3",
"clerk-solidjs": "^2.0.10", "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", "solid-js": "^1.9.5",
"stripe": "^22.1.1",
"tailwindcss": "^4.0.0",
"three": "^0.184.0", "three": "^0.184.0",
"twilio": "^6.0.2", "vite": "^7.0.0"
"valibot": "^0.29.0",
"vite": "^7.0.0",
"ws": "^8.21.0"
}, },
"engines": { "engines": {
"node": ">=22" "node": ">=22"
}, },
"devDependencies": { "devDependencies": {
"@playwright/test": "^1.60.0", "@tailwindcss/vite": "^4.0.7",
"@types/node-cron": "^3.0.11", "tailwindcss": "^4.0.7"
"@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"
} }
} }

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"; import { familyGroupMembers } from "./subscription";
export { familyGroupMembers };
/** /**
* Per-member service configuration. * Per-member service configuration.
* The primary account holder assigns which services each member gets. * The primary account holder assigns which services each member gets.
* Default: all members get darkwatch + spamshield + removebrokers. * Default: all members get darkwatch + spamshield + removebrokers.
* HomeTitle and VoicePrint limited by property/voice enrollment slots. * HomeTitle and VoicePrint limited by property/voice enrollment slots.
*/ */
export const familyMemberServices = sqliteTable("family_member_services", { export const familyMemberServices = sqliteTable(
id: text("id").primaryKey().$defaultFn(() => crypto.randomUUID()), "family_member_services",
memberId: text("member_id").notNull().references(() => familyGroupMembers.id, { onDelete: "cascade" }), {
service: text("service").notNull(), id: text("id")
enabled: integer("enabled", { mode: "boolean" }).default(true).notNull(), .primaryKey()
configuredBy: text("configured_by").notNull(), .$defaultFn(() => crypto.randomUUID()),
configuredAt: integer("configured_at", { mode: "timestamp_ms" }).defaultNow().notNull(), memberId: text("member_id")
createdAt: integer("created_at", { mode: "timestamp_ms" }).defaultNow().notNull(), .notNull()
updatedAt: integer("updated_at", { mode: "timestamp_ms" }).defaultNow().notNull().$onUpdate(() => new Date()), .references(() => familyGroupMembers.id, { onDelete: "cascade" }),
}, (table) => ({ service: text("service").notNull(),
memberServiceUnique: uniqueIndex("family_member_services_member_service_unique").on(table.memberId, table.service), enabled: integer("enabled", { mode: "boolean" }).default(true).notNull(),
memberIdIdx: index("family_member_services_member_id_idx").on(table.memberId), configuredBy: text("configured_by").notNull(),
serviceIdx: index("family_member_services_service_idx").on(table.service), 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. * Per-member alert notification preferences.
* Members can opt into/off specific alert types and channels. * Members can opt into/off specific alert types and channels.
*/ */
export const familyMemberAlertPreferences = sqliteTable("family_member_alert_preferences", { export const familyMemberAlertPreferences = sqliteTable(
id: text("id").primaryKey().$defaultFn(() => crypto.randomUUID()), "family_member_alert_preferences",
memberId: text("member_id").notNull().references(() => familyGroupMembers.id, { onDelete: "cascade" }), {
alertType: text("alert_type").notNull(), id: text("id")
channel: text("channel").notNull(), .primaryKey()
enabled: integer("enabled", { mode: "boolean" }).default(true).notNull(), .$defaultFn(() => crypto.randomUUID()),
createdAt: integer("created_at", { mode: "timestamp_ms" }).defaultNow().notNull(), memberId: text("member_id")
updatedAt: integer("updated_at", { mode: "timestamp_ms" }).defaultNow().notNull().$onUpdate(() => new Date()), .notNull()
}, (table) => ({ .references(() => familyGroupMembers.id, { onDelete: "cascade" }),
memberChannelTypeUnique: uniqueIndex("family_member_alert_prefs_member_channel_type_unique").on(table.memberId, table.channel, table.alertType), alertType: text("alert_type").notNull(),
memberIdIdx: index("family_member_alert_prefs_member_id_idx").on(table.memberId), 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", "$schema": "https://openapi.vercel.sh/vercel.json",
"framework": "solidstart", "framework": "solidstart",
"buildCommand": "npm run build", "buildCommand": "npm run build",
"installCommand": "npm install", "installCommand": "bun install",
"outputDirectory": ".output/public", "outputDirectory": ".output/public",
"regions": ["iad1"] "regions": ["iad1"]
} }