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"
|
"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"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,
|
||||||
|
),
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
|||||||
@@ -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"]
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user