← back to Zuber Internal

scripts/export-jsonl.js

26 lines

#!/usr/bin/env node
/* Export full zuber_catalog (every column the viewer's load() consumes) LOCAL
   dw_unified -> data/zuber.jsonl, one row per line. Uses psql (matching the
   server's own psql/row_to_json query) so JSONL rows are byte-identical to what
   the live psql path parses. Local read, $0. */
const fs = require('fs');
const path = require('path');
const { execFileSync } = require('child_process');

const PGURI = process.env.PGURI || 'postgresql://localhost/dw_unified';
const OUT = path.join(__dirname, '..', 'data', 'zuber.jsonl');
const Q = `SELECT json_agg(row_to_json(t)) FROM (
  SELECT mfr_sku, pattern_name, pattern_name_fr, color_name, collection, product_type,
    material, width, image_url, product_url, description,
    coalesce(all_images,'') AS all_images,
    ai_colors, ai_styles, ai_tags, color_hex,
    to_char(coalesce(crawled_at, last_scraped, now()),'YYYY-MM-DD"T"HH24:MI:SS') AS created_at
  FROM zuber_catalog ORDER BY id
) t;`;

const stdout = execFileSync('psql', [PGURI, '-tAqc', Q], { maxBuffer: 64 * 1024 * 1024 }).toString();
const rows = JSON.parse(stdout.trim() || 'null') || [];
fs.mkdirSync(path.dirname(OUT), { recursive: true });
fs.writeFileSync(OUT, rows.map((r) => JSON.stringify(r)).join('\n') + '\n');
console.log(`[zuber export] wrote ${rows.length} rows -> ${OUT}`);