← back to Homesonspec
apps/workers/scripts/register-pacific-regionals.ts
91 lines
/**
* Register Pacific-region REGIONAL builders as tracked onboarding targets.
* Upserts Builder + SourceRegistry rows (idempotent by slug / key), INACTIVE:
* collectionMethod=CRAWL, mediaRights=NONE (facts-only), active=false,
* health=PAUSED — so NOTHING is crawled until each builder gets a bespoke
* adapter. This just makes them visible "coming soon" targets (same shape as
* the existing 30 national builders) so the overnight loop can prioritize them.
* Run: DATABASE_URL=… pnpm --filter @homesonspec/workers exec tsx scripts/register-pacific-regionals.ts
*/
import { prisma } from "@homesonspec/database";
type Row = { name: string; site: string | null; states: string; note?: string };
const ROWS: Row[] = [
// California regionals
{ name: "Trumark Homes", site: "trumarkhomes.com", states: "CA;NV" },
{ name: "The New Home Company", site: "newhomeco.com", states: "CA;AZ;OR" },
{ name: "Warmington Residential", site: "homesbywarmington.com", states: "CA;NV" },
{ name: "Elliott Homes", site: "elliotthomes.com", states: "CA;AZ" },
{ name: "Christopherson Builders", site: "christophersonbuilders.com", states: "CA" },
{ name: "City Ventures", site: "cityventures.com", states: "CA" },
{ name: "Signature Homes", site: "sighomes.com", states: "CA" },
{ name: "Discovery Homes", site: "discoveryhomes.com", states: "CA" },
{ name: "Van Daele Homes", site: "vandaele.com", states: "CA" },
{ name: "SummerHill Homes", site: "summerhillhomes.com", states: "CA" },
{ name: "DeNova Homes", site: "denovahomes.com", states: "CA" },
{ name: "Raymus Homes", site: "raymushomes.com", states: "CA" },
{ name: "JMC Homes", site: "jmchomes.com", states: "CA" },
{ name: "Wathen Castanos Homes", site: "wathencorp.com", states: "CA" },
{ name: "Granville Homes", site: "granvillehomes.com", states: "CA" },
// Arizona regionals
{ name: "Fulton Homes", site: "fultonhomes.com", states: "AZ" },
{ name: "Camelot Homes", site: "camelothomes.com", states: "AZ" },
{ name: "Rosewood Homes", site: "rosewoodhomes.com", states: "AZ" },
{ name: "Cachet Homes", site: "cachethomes.net", states: "AZ" },
{ name: "Blandford Homes", site: "blandfordhomes.com", states: "AZ" },
// WA / OR regionals
{ name: "Holt Homes", site: "holthomes.com", states: "WA;OR" },
{ name: "Stone Bridge Homes NW", site: "stonebridgehomesnw.com", states: "WA;OR" },
{ name: "Soundbuilt Homes", site: "soundbuilthomes.com", states: "WA" },
{ name: "Pahlisch Homes", site: "pahlischhomes.com", states: "OR;WA" },
{ name: "Sekisui House US", site: "sekisuihouse.com", states: "WA;OR" },
// Nevada
{ name: "Harmony Homes", site: null, states: "NV", note: "recon-pending: verify NV Las Vegas domain before crawl" },
// Seeno-family brands sharing the discoveryhomes.com feed (onboarded via discovery-homes-site adapter)
{ name: "Seeno Homes", site: "discoveryhomes.com", states: "CA;NV", note: "Seeno-family; served by discovery-homes-site adapter" },
{ name: "Sterling Homes", site: "discoveryhomes.com", states: "CA;ID", note: "Seeno-family; served by discovery-homes-site adapter" },
// Hawaii
{ name: "Castle & Cooke Homes", site: "castlecooke.com", states: "HI" },
{ name: "Gentry Homes", site: "gentryhawaii.com", states: "HI" },
{ name: "Alexander & Baldwin", site: "alexanderbaldwin.com", states: "HI" },
];
const slugify = (s: string) =>
s.toLowerCase().replace(/&/g, "and").replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "");
async function main() {
let builders = 0, sources = 0;
for (const r of ROWS) {
const slug = slugify(r.name);
const websiteUrl = r.site ? `https://www.${r.site}` : null;
const builder = await prisma.builder.upsert({
where: { slug },
update: { name: r.name, websiteUrl, coverageArea: r.states },
create: { slug, name: r.name, websiteUrl, coverageArea: r.states, isDemo: false },
});
builders++;
const key = `${slug}-site`;
await prisma.sourceRegistry.upsert({
where: { key },
update: { builderId: builder.id, baseUrl: websiteUrl, notes: r.note ?? "pacific-regional onboarding target; adapter pending" },
create: {
key,
name: `${r.name} (builder website)`,
builderId: builder.id,
baseUrl: websiteUrl,
collectionMethod: "CRAWL",
mediaRights: "NONE",
rateLimitRpm: 10,
health: "PAUSED",
active: false,
notes: r.note ?? "pacific-regional onboarding target; adapter pending",
},
});
sources++;
console.log(` ✓ ${r.name} (${slug}) ${r.site ?? "[no domain]"}`);
}
console.log(`\nregistered ${builders} builders + ${sources} source rows (all inactive/facts-only; no crawl until adapters built)`);
await prisma.$disconnect();
}
main().catch(async (e) => { console.error(e); await prisma.$disconnect(); process.exit(1); });