import { createClient } from '@sanity/client' import { readFileSync } from 'fs' import { resolve } from 'path' import dotenv from 'dotenv' dotenv.config() const client = createClient({ projectId: process.env.SANITY_PROJECT_ID, dataset: process.env.SANITY_DATASET || 'production', apiVersion: '2024-01-01', useCdn: false, token: process.env.SANITY_API_TOKEN, }) // ── Upload image to Sanity ───────────────────────────────────────────────── async function uploadImage(filePath, filename) { const buffer = readFileSync(resolve(filePath)) const asset = await client.assets.upload('image', buffer, { filename }) console.log(` ✓ Image uploaded: ${filename} → ${asset._id}`) return asset._id } // ── Products data ────────────────────────────────────────────────────────── const PRODUCTS = [ { name: 'Solar_Altar', productDisplayName: 'Solar Altar', slug: { _type: 'slug', current: 'solar-altar' }, sortOrder: 0, index: 'PROJET_001', type: 'LAMPE DE TABLE', materials: 'BÉTON TEXTURÉ + DÔME CÉRAMIQUE LAQUÉ', year: '2026', status: 'PROTOTYPE [80%]', description: 'Exploration de la lumière à travers des contraintes géométriques. Le dôme sphérique en céramique laquée coiffe un corps en béton texturé peint à la main. Chaque pièce est unique.', specs: 'H: 45cm / Ø: 18cm\nPoids: 3.2kg\nAlimentation: 220V — E27\nCâble: tressé rouge 2m', notes: 'Inspiré des lampadaires soviétiques des années 60. Le béton est coulé à la main dans des moules uniques. La peinture acrylique est appliquée au spalter.', imageFile: 'public/assets/lamp-violet.jpg', imageAlt: 'Solar Altar — Lampe béton violet, dôme céramique bleu, REBOURS 2026', seoTitle: 'REBOURS — Solar Altar | Collection 001', seoDescription: 'Lampe de table unique. Béton texturé coulé à la main + dôme céramique laqué. Pièce unique fabriquée à Paris.', price: 180000, currency: 'EUR', availability: 'https://schema.org/LimitedAvailability', isPublished: true, }, { name: 'TABLE_TERRAZZO', productDisplayName: 'Table Terrazzo', slug: { _type: 'slug', current: 'table-terrazzo' }, sortOrder: 1, index: 'PROJET_002', type: 'TABLE BASSE + ÉTAGÈRE MODULAIRE', materials: 'TERRAZZO + ACIER TUBULAIRE + RÉSINE', year: '2026', status: 'STRUCTURAL_TEST', description: "Collision du brutalisme et de la couleur Memphis. Le plateau en terrazzo fait à la main intègre des inclusions de marbre rose et bleu. Les colonnes cylindriques bicolores sont en acier peint au four.", specs: 'Table: L120 × P60 × H38cm\nPoids plateau: 28kg\nPieds: acier Ø60mm\nÉtagère: H180 × L80 × P35cm', notes: "Le terrazzo est réalisé dans l'atelier de Pantin. Chaque dalle est unique. L'étagère est assemblée à partir de tubes industriels récupérés et de panneaux laqués.", imageFile: 'public/assets/table-terrazzo.jpg', imageAlt: 'TABLE TERRAZZO — Table basse terrazzo et étagère acier, REBOURS 2026', seoTitle: 'REBOURS — TABLE TERRAZZO | Collection 001', seoDescription: 'Table basse et étagère modulaire. Terrazzo fait main + acier tubulaire. Pièce unique fabriquée à Paris.', price: null, currency: 'EUR', availability: 'https://schema.org/PreOrder', isPublished: true, }, { name: 'MODULE_SÉRIE', productDisplayName: 'Module Série', slug: { _type: 'slug', current: 'module-serie' }, sortOrder: 2, index: 'PROJET_003', type: 'LAMPES — SÉRIE LIMITÉE', materials: 'BÉTON COLORÉ + DÔME LAQUÉ + NÉON', year: '2026', status: 'FINAL_ASSEMBLY', description: "Série de 7 lampes aux corps béton colorés, chacune avec un dôme d'une couleur différente. Les néons horizontaux créent un anneau lumineux entre le dôme et le corps.", specs: 'H: 35–65cm (7 tailles)\nDôme: Ø15–28cm\nAnneau néon: 8W — 3000K\nÉdition: 7 ex. par coloris', notes: 'Les corps sont coulés en série mais peints individuellement. Les dômes sont réalisés par un souffleur de verre artisanal. Le câble tressé rouge est la signature de la série.', imageFile: 'public/assets/lampes-serie.jpg', imageAlt: 'MODULE SÉRIE — Collection de 7 lampes béton colorées, REBOURS 2026', seoTitle: 'REBOURS — MODULE SÉRIE | Collection 001', seoDescription: 'Série de 7 lampes béton colorées, dôme laqué et néon. Édition limitée fabriquée à Paris.', price: null, currency: 'EUR', availability: 'https://schema.org/PreOrder', isPublished: true, }, ] // ── Seed ─────────────────────────────────────────────────────────────────── async function seed() { console.log('🌱 Seeding Sanity...\n') for (const product of PRODUCTS) { const { imageFile, imageAlt, ...data } = product // Upload image console.log(`📦 ${product.name}`) const imageAssetId = await uploadImage(imageFile, imageFile.split('/').pop()) // Create document const doc = { _type: 'product', ...data, image: { _type: 'image', alt: imageAlt, asset: { _type: 'reference', _ref: imageAssetId }, }, } const result = await client.create(doc) console.log(` ✓ Created: ${result._id}\n`) } console.log('✅ Seed complete!') } seed().catch((err) => { console.error('❌ Seed failed:', err.message) process.exit(1) })