resetting
This commit is contained in:
10232
pnpm-lock.yaml
generated
10232
pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load Diff
@@ -1,3 +0,0 @@
|
||||
packages:
|
||||
- "web"
|
||||
- "browser-ext"
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
),
|
||||
}),
|
||||
);
|
||||
|
||||
@@ -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"]
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user